"""The Ceylon metamodel closed type and model package.
   
   As described in the [ceylon.language.meta](../index.html) documentation, this package contains all
   the types that represent Ceylon closed types and models.
   
   ### Usage example
   
   The following code will list all the value declarations in the `ceylon.language` package and print their
   current value:
   
       Package languagePackage = `package ceylon.language`;
       ValueDeclaration[] valueDeclarations = languagePackage.members<ValueDeclaration>();
       Value<Anything>[] valueModels = valueDeclarations*.apply<Anything>();
       for(val in valueModels){
           // skip the nothing value which cannot be read
           if(val.type != `Nothing`){
               print(val.get());
           }
       }
	
   The following code will iterate all the class declarations in the `ceylon.language` package that
   are not abstract, anonymous or annotations, and that have no type parameters nor initialiser
   parameters. For each matching class, we will apply it to get a class model which we can then
   use to instantiate the class and display its instance:
   
       for(decl in `package ceylon.language`.members<ClassDeclaration>()){
           if(!decl.abstract 
                   && !decl.anonymous 
                   && !decl.annotation
                   && decl.parameterDeclarations.empty
                   && decl.typeParameterDeclarations.empty){
               Class<Object,[]> classModel = decl.classApply<Object,[]>();
               Object instance = classModel();
               print("Instance of ``decl.name`` is: ``instance``");
           }
       }
   """
by ("Gavin King", "Stephane Epardaud", "Tom Bentley")
tagged("Metamodel")
shared package ceylon.language.meta.model;