    import ceylon.language.meta {
        classDeclaration, type
    }

    "A context representing serialization of many objects to a
     single output stream.

     The serialization library obtains an instance by calling
     [[serialization]] and then uses
     [[references]] to traverse the instances reachable from the
     instance(s) being serialized.

     It is the serialization library's responsibility to
     manage object identity and handle cycles in the graph
     of object references. For example a serialization library
     that produced a hierarchical format might ignore identity
     when an instance is encountered multiple times
     (resulting in duplicate subtrees in the output), and
     simply throw an exception if it encountered a cycle.
     "
    shared sealed
    interface SerializationContext {
        // could be generic
        "Obtain the references of the given instance."
        throws(`class SerializationException`,
            "If the class is not serializable")
        shared formal References references(Anything instance);
    }

    class SerializationContextImpl() satisfies SerializationContext {
        shared actual References references(Anything instance) {
            if (classDeclaration(instance).serializable) {
                return ReferencesImpl(instance);
            } else {
                throw SerializationException("instance of non-serializable class: ``type(instance)``");
            }
        }
    }