/**
 * Represents a package within a JDOMetadata.
 * @since 2.3
 */
public interface PackageMetadata extends Metadata {
    /**
     * Accessor for the name of this package (set on construction).
     * 
     * @return The name
     */
    String getName();

    /**
     * Method to set the catalog (ORM) to apply to all classes in this package.
     * 
     * @param catalog Catalog name
     */
    PackageMetadata setCatalog(String catalog);

    /**
     * Accessor for the catalog (ORM) that all classes in this package default
     * to.
     * 
     * @return The catalog
     */
    String getCatalog();

    /**
     * Method to set the schema (ORM) to apply to all classes in this package.
     * 
     * @param schema Schema name
     */
    PackageMetadata setSchema(String schema);

    /**
     * Accessor for the schema (ORM) that all classes in this package default to.
     * 
     * @return The schema
     */
    String getSchema();

    /**
     * Accessor for all classes defined in this package.
     * 
     * @return The classes
     */
    ClassMetadata[] getClasses();

    /**
     * Add a new class to this package.
     * 
     * @param name Name of the class
     * @return The ClassMetadata
     */
    ClassMetadata newClassMetadata(String name);

    /**
     * Add a new class to this package.
     * 
     * @param cls The class
     * @return The ClassMetadata
     */
    ClassMetadata newClassMetadata(Class cls);

    /**
     * Accessor for the number of classes defined in this package.
     * 
     * @return The number of classes.
     */
    int getNumberOfClasses();

    /**
     * Accessor for all interfaces defined in this package.
     * 
     * @return The interfaces
     */
    InterfaceMetadata[] getInterfaces();

    /**
     * Add a new interface to this package.
     * 
     * @param name The interface name
     * @return The InterfaceMetadata
     */
    InterfaceMetadata newInterfaceMetadata(String name);

    /**
     * Add a new interface to this package.
     * 
     * @param cls The class
     * @return The ClassMetadata
     */
    InterfaceMetadata newInterfaceMetadata(Class cls);

    /**
     * Accessor for the number of interfaces defined in this package.
     * 
     * @return The number of interfaces.
     */
    int getNumberOfInterfaces();

    /**
     * Accessor for any sequences defined on the package.
     * 
     * @return The sequences
     */
    SequenceMetadata[] getSequences();

    /**
     * Add a new sequence to this package.
     * 
     * @param name Name of the sequence
     * @param strategy Strategy for the sequence
     * @return The SequenceMetadata
     */
    SequenceMetadata newSequenceMetadata(String name,
            SequenceStrategy strategy);

    /**
     * Accessor for the number of sequences defined for this package.
     * 
     * @return The number of sequences.
     */
    int getNumberOfSequences();
}
