//  Copyright 2004, 2008 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package org.apache.tapestry.enhance;

/**
 *  This interface represents a class to be enhanced. An implementation 
 *  is generated by {@link org.apache.tapestry.enhance.IEnhancedClassFactory} 
 *  and is specific to the selected system of enhancement.
 * 
 *  @author Mindbridge
 *  @since 3.0
 */
public interface IEnhancedClass
{
    String getClassName();
    
    /**
     * Adds an enhancer for creating the specified property.
     */
    void createProperty(String propertyName, String propertyType);

    void createProperty(
        String propertyName,
        String propertyType,
        String readMethodName,
        boolean persistent);

    void createAutoParameter(
        String propertyName,
        String parameterName,
        String typeClassName,
        String readMethodName);

    boolean hasModifications();

    Class createEnhancedSubclass();
    
    /**
     * Adds an arbitrary enhancer.
     */
    void addEnhancer(IEnhancer enhancer);

    void addInterface(Class type);

    void addMethod(int modifiers, MethodSignature signature, String body);

    void addField(String name, Class type);
    
    void addConstructor(Class[] parameterTypes, Class[] exceptions, String body);

    /**
     * Returns true if the same method was previously added via
     * {@link #addMethod(int, MethodSignature, String)}.
     *
     * @param signature
     *          The signature to check existance of.
     * @return True if the same method has been added already, false otherwise.
     */
    boolean containsMethod(MethodSignature signature);
}
