(currently not implemented) To have a convenient notation to express UML diagrams textually, we extend the class dictionary notation as follows: An edge label may have an optional cardinality constraint part: The following are examples of legal edge labels: // same as The presence of those cardinality constraints allows us to express collections at a higher level of abstraction. For example: Constraints = Constraint. may have any number of implementations: Implementation 1: Constraints = List(Constraint). List(S) ~ {S}. Implementation 2: Constraints = [ NList(Constraint)]. NList(S) ~ S {S}. Implementation 3: Constraints = MyList(S). MyList(S) : Empty(S) | NonEmpty(S). Empty(S) = . NonEmpty(S) = S MyList(S). etc. To translate class dictionaries into UML notation, we use the following approach: (see also: http://www.ccs.neu.edu/research/demeter/course/f96/APbookWithDemJava.html ) R ~ {S}. R = S. R ~ S {S}. R = S. List(S) ~ {S}. List(S) = S. NList(S) ~ S {S}. List(S) = S. Note: This is currently a design notation. No tool support yet.