    "Declaration which can be invoked, and may have parameters. Classes
     and functions are functional declarations.

     Note that multiple-parameter lists are not reified at runtime, so if you
     have a function declaration like this:

         Integer add(Integer a)(Integer b) => a + b;

     It will only have a single parameter list at runtime (the first), and its return
     type will be `Callable<Integer,[Integer]>`.
     "
    shared sealed interface FunctionalDeclaration {

        "True if the current declaration is an annotation class or function."
        shared formal Boolean annotation;

        "The list of parameter declarations for this functional declaration."
        shared formal FunctionOrValueDeclaration[] parameterDeclarations;

        "Gets a parameter declaration by name. Returns `null` if no such parameter exists."
        shared formal FunctionOrValueDeclaration? getParameterDeclaration(String name);
    }