"""A class model represents the model of a Ceylon class that you can instantiate and inspect.
   
   A class is a toplevel type, declared on a package.
   
   This is a [[ClassModel]] that you can also invoke to instantiate new instances of the class:
   
       shared class Foo(String name){
           shared String hello => "Hello "+name;
       }
       
       void test(){
           Class<Foo,[String]> c = `Foo`;
           // This will print: Hello Stef
           print(c("Stef").hello);
       }
 """
shared sealed interface Class<out Type=Anything, in Arguments=Nothing>
    satisfies ClassModel<Type, Arguments> & Applicable<Type, Arguments>
    given Arguments satisfies Anything[] {
    
    /*"The constructor with the given name, or null if this class lacks 
     a constructor of the given name."
    shared actual formal Function<Type, Arguments>? getCallableConstructor<Arguments=Nothing>(String name)
            given Arguments satisfies Anything[];
    
    shared actual formal Value<Type>? getValueConstructor(String name);*/
    
    "A model of the default constructor (for a class with constructors) 
     or class initializer (for a class with a parameter list), or null
     if the class has constructors, but lacks a default constructor."
    shared actual formal CallableConstructor<Type, Arguments>? defaultConstructor;
    
    "The constructor with the given name, or null if this class lacks 
     a constructor of the given name."
    shared actual formal CallableConstructor<Type, Arguments>|ValueConstructor<Type>? getConstructor
            <Arguments>
            (String name)
                given Arguments satisfies Anything[];
}