"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 { }