/**
 * Describes a type in a certain programming model.
 * <p>
 * A programming model is identified by a URI.
 *
 */

public abstract class Clazz
{

    public static final String JDK_JAVA_BEANS_MODEL_URI = "JDK-Java-Beans";

    public static final String EXTENDED_BEANS_MODEL_URI = "Extended-Beans";

    public static final String DYNA_BEANS_MODEL_URI = "Dyna-Beans";

    public static final String MAP_MODEL_URI = "Map";

    public static final String EJB_LOCAL_ENTITY_MODEL_URI = "EJB-Local-Entity";

    /**
     * Given a clazz name and a model that clazz belongs to,
     * returns the corresponding Clazz.
     */
    public static Clazz forName(String name, String modelURI){
    }

    /**
     * Returns a Clazz that describes the given object
     * in the scope of the given model.
     */
    public static Clazz getClazz(Object object, String modelURI){
    }

    /**
     * Automatically detects the default model for the given
     * object and returns the corresponding Clazz in that model.
     */
    public static Clazz getClazz(Object object){
    }

    /**
     * Returns the model URI for the model this Clazz belongs to.
     */
    public String getModelURI(){
    }

    /**
     * Returns the clazz name
     */
    public String getName(){
    }

    /**
     * Returns the list of field names for this Clazz
     */
    public abstract String[] getFieldNames();

    /**
     * Returns a Field for the given name
     */
    public abstract Field getField(String name);

    /**
     * Returns attributes for this Clazz
     */
    public abstract Attribute[] getAttributes();

    /**
     * Creates a new instance of this Clazz
     */
    public abstract Object newInstance();

    /**
     * Creates a new instance of this Clazz using the supplied parameters
     */
    public abstract Object newInstance(Object[] parameters);
}
