    """Represents classes or functions that you can apply in a type-unsafe way.
       """
    since("1.1.0")
    shared sealed interface Applicable<out Type=Anything, in Arguments=Nothing>
            satisfies Callable<Type,Arguments>
            given Arguments satisfies Anything[] {

        "Type-unsafe application, to be used when the argument types are unknown until runtime.

         This has the same behaviour as invoking the applicable directly, but exchanges compile-time type
         safety with runtime checks."
        throws(`class IncompatibleTypeException`, "If any argument is not assignable to this applicable's corresponding parameter")
        throws(`class InvocationException`, "If there are not enough or too many provided arguments")
        shared formal Type apply(Anything* arguments);

        "Type-unsafe application by name, to be used when the argument types are unknown until runtime.

         This has the same behaviour as invoking the applicable directly, but exchanges compile-time type
         safety with runtime checks."
        throws(`class IncompatibleTypeException`, "If any argument is not assignable to this applicable's corresponding parameter")
        throws(`class InvocationException`, "If there are not enough or too many provided arguments,
                                             or if the target does not support named invocation")
        shared formal Type namedApply({<String->Anything>*} arguments);
    }