    """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 interface Class<out Type=Anything, in Arguments=Nothing>
        satisfies ClassModel<Type, Arguments> & Callable<Type, Arguments>
        given Arguments satisfies Anything[] {

        "Type-unsafe initialiser application, to be used when the argument types are unknown until runtime.

         This has the same behaviour as invoking this `Class` directly, but exchanges compile-time type
         safety with runtime checks."
        throws(`class IncompatibleTypeException`, "If any argument is not assignable to this initialiser's corresponding parameter")
        throws(`class InvocationException`, "If there are not enough or too many provided arguments")
        shared formal Type apply(Anything* arguments);
    }