import ceylon.language.meta.model { AppliedType = Type }
"""Model for members that can be bound to a containing instance to turn them into toplevel models.
You can bind a member to an instance by invoking that member with the instance as parameter:
shared class Outer(String name){
shared class Inner(){
shared String hello => "Hello "+name;
}
}
void test(){
Member<Outer,Class<Outer.Inner,[]>> memberClass = `Outer.Inner`;
Class<Outer.Inner,[]> c = memberClass(Outer("Stef"));
// This will print: Hello Stef
print(c().hello);
}
"""
shared sealed interface Member<in Container=Nothing, out Kind=Model>
satisfies Qualified<Kind,Container>
given Kind satisfies Model {
"The declaring closed type. This is the type that declared this member."
shared formal AppliedType<> declaringType;
/*"Type-unsafe container binding, to be used when the container type is unknown until runtime.
This has the same behaviour as invoking this `Member` directly, but exchanges compile-time type
safety with runtime checks."
throws(`class IncompatibleTypeException`, "If the container is not assignable to this member's container")
shared formal Kind bind(Object container);*/
}