    """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[];
    }