    """A class model represents the model of a Ceylon class that you can instantiate and inspect.

       A member class is is declared on classes or interfaces.

       This is both a [[ClassModel]] and a [[Member]]: you can invoke it with an instance value
       to bind it to that instance and obtain a [[Class]]:

           shared class Outer(String name){
               shared class Inner(){
                   shared String hello => "Hello "+name;
               }
           }

           void test(){
               MemberClass<Outer,Outer.Inner,[]> memberClass = `Outer.Inner`;
               Class<Outer.Inner,[]> c = memberClass(Outer("Stef"));
               // This will print: Hello Stef
               print(c().hello);
           }
     """
    shared sealed interface MemberClass<in Container=Nothing, out Type=Anything, in Arguments=Nothing>
            satisfies ClassModel<Type, Arguments> & Member<Container, Class<Type, Arguments>>
            given Arguments satisfies Anything[] {

        shared actual formal Class<Type, Arguments> bind(Object container);

        shared actual formal MemberClassCallableConstructor<Container, Type, Arguments>? defaultConstructor;

        "The constructor with the given name, or null if this class lacks
         a constructor of the given name"
        shared actual formal MemberClassCallableConstructor<Container,Type,Arguments>|MemberClassValueConstructor<Container,Type>? getConstructor<Arguments>(String name)
            given Arguments satisfies Anything[];
        /*shared actual formal MemberClassConstructor<Container,Type, Arguments>? getConstructor<Arguments=Nothing>(String name)
                given Arguments satisfies Anything[];*/
    }