//  Copyright 2004 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);
}
