    import ceylon.language.meta.declaration{CallableConstructorDeclaration}

    """A callable constructor model represents the model of a Ceylon class
       constructor that you can invoke and inspect

       ## Callablity

       As with [[Function]] you can also invoke a `CallableConstructor`, doing so
       instantiates an instance:

            shared class Foo {
                shared String name;
                shared new foo(String name) {
                    this.name = name;
                }
            }

            void test() {
            Constructor<Foo,[String]> ctor = `Foo.foo`;
            // This will print: Stef
            print(ctor("Stef").name);

       ## Genericity

       This class inherits [[Generic]] but a constructor in Ceylon cannot
       have a type parameters.
       For symmetry with [[CallableConstructorDeclaration.apply]] the
       [[typeArguments]] and [[typeArgumentList]] refer to the type arguments
       of the constructor's class.
       """
    shared sealed interface CallableConstructor<out Type=Object, in Arguments=Nothing>
            satisfies FunctionModel<Type, Arguments> & Applicable<Type, Arguments>
            given Arguments satisfies Anything[] {

        "This constructor's declaration."
        shared formal actual CallableConstructorDeclaration declaration;

        shared formal actual ClassModel<Type> type;

        "The class containing this constructor; the type of instances produced
         by this constructor."
        shared actual formal ClassModel<Type>? container;

    }