We have:
-------
MooseEntity is an abstract entity. Entities should subclass this class.
The state instance variable provides a mechanism for extending the state of entities.
Proposition:
----------
MooseEntity is an abstract class that refines MooseElement. Model entities should be
instances of subclasses this class.
MooseEntity provides way to add state for model extensions as well as meta information
(property and navigation).
For example a package can extend an entity to add more state and such extension should be
only visible when the package is loaded.
Any MooseEntiy can extended with property that is described using the FAME meta model.
Here is an example: FAMIXAttribute defined the property AHNL as follow using the pragma
<property:longName:description:>
FAMIXAttribute>>hierarchyNestingLevel
<property: #AHNL longName: 'Attribute hierarchy nesting level'
description: 'The hierarchy nesting level of an attribute.'>
^self
lookUpPropertyNamed: #AHNL
computedAs: [self belongsTo hierarchyNestingLevel]
In addition, any MooseEntity can also be annotated with navigation declarations (which are
used by the environment to propose navigation options to the user).
For example, the class FAMIXClass can define the navigation 'Accessor Methods' as
follows
FAMIXClass>>accessorMethodsGroup
<navigation: 'Accessor methods'>
^ FAMIXMethodGroup withAll: (self accessorMethods) withDescription: 'Pure accessors
in ', self name
The pragma <navigation:> declares that the method accessorMethodsGroup is the method
to invoke to get the associated navigation.
The method navigationSelectors (see below) returns the list of methods declaring
navigation of a given MooseEntity.
Finally, MooseEntity provides the possibility to add simple annotations (we call
properties to avoid clash name with Java annotations),
to any moose model element. For example, a new information can be added to any model
entity and it should be accessible. Like for example
a comment. Note that such a solution does not use FAME based description and as such will
not appear when we will query the declared properties.
propertyNamed: name
propertyNamed: name put: value
Have a look at the test testProperty for an example of property use.
Some API:
description
returns the description (FAME instance) described the receiver.
allDeclaredProperties
return the properties (FAME instances) that describe the receiver. The properties are
defined using <property:longName:description:>.
navigationSelectors
Return the list of methods that support the receiver navigation.
For example FAMIXClass instance can be navigated via #(#outgoingInvocationsGroup
#allExternalMultiplications #invokedClasses #allExternalDuplications #clientClasses
#invokingClasses #allMultiplications #allInternalDuplications #abstractMethodsGroup
#providerClasses #allInternalMultiplications #accessorMethodsGroup #allDuplicatingClasses
#incomingAccessesGroup #subclassHierarchyGroup #superclassHierarchyGroup #methodsGroup
#withSuperclassHierarchyGroup #withSubclassHierarchyGroup #classes)
Try: FAMIXClass allInstances first navigationSelectors.
allPropertySelectors
Return a dictionary with all properties of the entity, including metamodel properties,
metrics, and navigation groups.
Keys are abstract names of properties, values are implementing selectors.
for example: #ATFD -> #numberOfAccessesToForeignData means that ATDF is computed by
invoking the method #numberOfAccessesToForeignData.
The state instance variable provides a mechanism for extending the state of entities.