Specifications of all the meta-classes of AAF that provides meta-information about classes, properties and data types. The classes described may be AAF interchangeable classes, extension metadata classes or entirely unrelated. AAF meta-classes are specified in section 27 of the AAF object specification v1.1. The root class for the definition of meta-classes is {@link tv.amwa.maj.meta.MetaDefinition MetaDefinition}, which can also be serialized to an AAF file used as part of a {@linkplain tv.amwa.maj.meta.MetaDictionary meta dictionary}.

The interfaces defined in this package are fundamental to the features of the industry package, including the runtime {@linkplain tv.amwa.maj.industry.MediaEngine media engine}, {@linkplain tv.amwa.maj.industry.Warehouse warehouse} and {@linkplain tv.amwa.maj.industry.Forge forge}.

## Class and property definitions

Every class is defined by a {@linkplain tv.amwa.maj.meta.ClassDefinition class definition} that includes its position in a class hierarchy (single inheritance), name, identifier and whether it is concrete or abstract. Class definitions in MAJ are generated automatically by registering a Java class with the {@linkplain tv.amwa.maj.industry.Warehouse warehouse} using the {@link tv.amwa.maj.industry.Warehouse#lookForClass(Class) lookForClass(Class)} method. The class must be annotated with the {@link tv.amwa.maj.industry.MediaClass media class annotation}. This allows dynamic runtime extension of the classes supported.

Classes have properties that are defined by {@linkplain tv.amwa.maj.meta.PropertyDefinition property definitions}. To access the property definitions for a class, use the {@link tv.amwa.maj.meta.ClassDefinition#getPropertyDefinitions()} and {@link tv.amwa.maj.meta.ClassDefinition#getAllPropertyDefinitions()} methods. To get the values of the properties for a given class, call {@link tv.amwa.maj.meta.ClassDefinition#getProperties(tv.amwa.maj.industry.MetadataObject) getProperties(MetadataObject)}, where the metadata object is the instance to be queried.

## TypeDefinitions

Every property has a data type and the supported data types are defined by {@linkplain tv.amwa.maj.meta.TypeDefinition type definitions}. All type definitions have a name and identifier. Other parameters are type-specific, with over 150 {@linkplain tv.amwa.maj.industry.TypeDefinitions pre-defined for AAF} and the ability to {@linkplain tv.amwa.maj.industry.Warehouse#register(tv.amwa.maj.meta.TypeDefinition, String, String) add new type definitions} to the warehouse.

Every type definition provides methods for mapping from the Java representation of a value to a form suitable for representation as AAF or MXF. In particular, the {@linkplain tv.amwa.maj.meta.TypeDefinition#createValue(Object) createValue(Object)} method of every type definition is used extensively in the factory methods of the {@linkplain tv.amwa.maj.industry.Forge forge}. The type mappings supported are described in the documentation for the industry package.

## Property values

A {@linkplain tv.amwa.maj.industry.PropertyValue property value} is a representation of a value with its type. Many of the methods of the {@linkplain tv.amwa.maj.meta.TypeDefinition type definitions} manipulate property values and will throw a {@link tv.amwa.maj.exception.IllegalPropertyValueException IllegalPropertyValueException} if an attempt is made to use the methods for a value of the wrong type.

## Heritage

In the C-based API, the class, property and type definitions are available in a file called "`AAFMetaDictionary.h`". This is extracted from a spreadsheet containing equivalent information. The same extraction process is used to generate a large number of header files, such as "`AAFProeprtyDefs.h`". This approach has been replaced in the MAJ API through the use of the {@link tv.amwa.maj.industry.MediaClass MediaClass} and {@link tv.amwa.maj.industry.MediaProperty MediaProperty} annotations. These annotations have been tested against the same AAF meta dictionary to ensure that they contain the same values, which is what makes the C-based implementation and the MAJ API interoperable.

Many of the methods of the meta-classes were originally specified for the C-based reference implementation and have been translated using the same process described for the interchangeable classes.

@see tv.amwa.maj.industry.MediaEngine @see tv.amwa.maj.industry.Forge @see tv.amwa.maj.industry.Warehouse @see tv.amwa.maj.industry.PropertyValue