    import ceylon.language.meta.declaration {
        ValueDeclaration
    }

    "An instance referring to another instance via a reference attribute."
    shared sealed interface Member // or Reference
            satisfies ReachableReference {
        "The attribute making the reference."
        shared formal ValueDeclaration attribute;

        "The [[referred]] instance reachable from the given [[instance]].

         Note: If this member refers to a `late` declaration and the
         attribute of the given instance has not been initialized this
         method will return [[uninitializedLateValue]]."
        shared actual formal Anything referred(Object/*<Instance>*/ instance);

    }

    "The type of [[uninitializedLateValue]]."
    shared abstract class UninitializedLateValue() of uninitializedLateValue {}

    "A singleton used to indicate that a `late` [[Member]] of a particular
     instance has not been initialized.

     For example, given

         class Example() {
             shared late Example parent;
         }

     Then

         value ex = Example();// uninitialized parent
         value context = serialization();
         value refs = context.references(ex);
         assert(is Member parentRef = refs.find((element) => element is Member));
         assert(parentRef.referred(ex) == uninitializedLateValue);

     Thus, *if a serialization library supports it*, it is
     possible to serialize uninitialized `late` values.
    "
    shared object uninitializedLateValue extends UninitializedLateValue() {}