    import ceylon.language.meta.declaration {
        FunctionalDeclaration,
        NestableDeclaration
    }
    import ceylon.language.meta.model {
        ClosedType = Type
    }

    """A function model represents the model of a Ceylon function that you can inspect.

       A function model can be either a toplevel [[Function]], a
       [[CallableConstructor|callable constructor]] of a toplevel Class,
       a member [[Method]] or [[CallableMemberConstructor|callable constructor]]
       of a member class.
     """
    shared sealed interface FunctionModel<out Type=Anything, in Arguments=Nothing>
            satisfies Model & Generic & Functional
            given Arguments satisfies Anything[] {

        "This function's declaration."
        shared formal actual NestableDeclaration&FunctionalDeclaration declaration;

        "This function's return closed type."
        shared formal ClosedType<Type> type;
    }