    "An annotation constrained to appear only on certain program
     elements, and only with certain values.

     This interface should never be satisfied directly by any
     annotation type. Instead, either [[OptionalAnnotation]] or
     [[SequencedAnnotation]] should be satisfied by the
     annotation type.

     The type parameters encode information about the annotation
     type and its constraints:

      - [[Value]] represents the type of the annotation itself,
      - [[ProgramElement]] represents a constraint on the
        _reference expression type_ of the annotated program
        element, for example,
        [[ceylon.language.meta.declaration::ClassDeclaration]]
        or [[ceylon.language.meta.declaration::Module]], where
        [[Annotated]] means there is no constraint, and
      - [[Type]] is a constraint on the _metamodel type_ of the
        annotated program element, for example,
        [[`Function<Float,[Float,Float]>`
         |ceylon.language.meta.model::Function]],
        where `Anything` means there is no constraint, and that
        the program element need not have a metamodel type."
    see (`interface Annotation`,
         `interface OptionalAnnotation`,
         `interface SequencedAnnotation`)
    shared interface ConstrainedAnnotation<out Value=Annotation,
                out Values=Anything, in ProgramElement=Nothing,
                out Type=Anything>
            of Value
            //Note: adding the following constraint would
            //      make ConstrainedAnnotation a GADT, which
            //      the language does not currently support
            //of OptionalAnnotation<Value,ProgramElement> |
            //   SequencedAnnotation<Value,ProgramElement>
            satisfies Annotation
            given Value satisfies Annotation
            given ProgramElement satisfies Annotated {

    }