# This file is generated by build_uml.py. DO NOT EDIT!

from properties import association, attribute, enumeration, derivedunion, redefine
from element import Element
class Relationship(Element): pass
class DirectedRelationship(Relationship): pass
class Include(DirectedRelationship): pass
class NamedElement(Element): pass
class PackageableElement(NamedElement): pass
class Type(PackageableElement): pass
class RedefinableElement(NamedElement): pass
class ActivityNode(RedefinableElement): pass
class TypedElement(NamedElement): pass
class ObjectNode(ActivityNode, TypedElement): pass
class Pin(ObjectNode): pass
class InputPin(Pin): pass
class ValuePin(InputPin): pass
class ValueSpecification(TypedElement): pass
class LiteralSpecification(ValueSpecification): pass
class LiteralInteger(LiteralSpecification): pass
class ExecutableNode(ActivityNode): pass
class MultiplicityElement(Element): pass
class Feature(RedefinableElement): pass
class StructuralFeature(TypedElement, MultiplicityElement, Feature): pass
class Namespace(NamedElement): pass
class Classifier(Namespace, RedefinableElement, Type): pass
class Artifact(Classifier): pass
class ConnectableElement(TypedElement): pass
class BehavioralFeature(Namespace, Feature): pass
class BehavioredClassifier(Classifier): pass
class Class(BehavioredClassifier): pass
class Node(Class): pass
class Device(Node): pass
class InstanceSpecification(PackageableElement): pass
class EnumerationLiteral(InstanceSpecification): pass
class InteractionFragment(NamedElement): pass
class Behavior(Class): pass
class Interaction(InteractionFragment, Behavior): pass
class StructuredClassifier(Classifier): pass
class Expression(ValueSpecification): pass
class ConnectorEnd(MultiplicityElement): pass
class Package(PackageableElement, Namespace): pass
class ExtensionPoint(RedefinableElement): pass
class PackageMerge(DirectedRelationship): pass
class Vertex(NamedElement): pass
class State(Vertex, RedefinableElement, Namespace): pass
class FinalState(State): pass
class PackageImport(DirectedRelationship): pass
class ProfileApplication(PackageImport): pass
class Action(ExecutableNode): pass
class GeneralOrdering(NamedElement): pass
class Association(Classifier, Relationship): pass
class CommunicationPath(Association): pass
class Extension(Association): pass
class ControlNode(ActivityNode): pass
class JoinNode(ControlNode): pass
class Pseudostate(Vertex): pass
class Comment(Element): pass
class Slot(Element): pass
class Actor(Classifier): pass
class Region(Namespace, RedefinableElement): pass
class TaggedValue(ValueSpecification): pass
class Generalization(DirectedRelationship): pass
class Extend(DirectedRelationship): pass
class LiteralBoolean(LiteralSpecification): pass
class Dependency(DirectedRelationship, PackageableElement): pass
class Abstraction(Dependency): pass
class Manifestation(Abstraction): pass
class Realization(Abstraction): pass
class Implementation(Realization): pass
class ActivityGroup(Element): pass
class MergeNode(ControlNode): pass
class Transition(RedefinableElement, NamedElement): pass
class Permission(Dependency): pass
class ActivityEdge(RedefinableElement): pass
class ElementImport(DirectedRelationship): pass
class InitialNode(ControlNode): pass
class Parameter(TypedElement, MultiplicityElement): pass
class Presentation(object): pass
class Component(Class): pass
class Constraint(PackageableElement): pass
class FinalNode(ControlNode): pass
class LiteralUnlimitedNatural(LiteralSpecification): pass
class UseCase(BehavioredClassifier): pass
class Interface(Classifier, ConnectableElement): pass
class Operation(BehavioralFeature): pass
class ControlFlow(ActivityEdge): pass
class Message(NamedElement): pass
class FlowFinalNode(FinalNode): pass
class Property(StructuralFeature, ConnectableElement): pass
class Activity(Behavior): pass
class Substitution(Realization): pass
class Stereotype(Class): pass
from diagram import Diagram
class StateMachine(Behavior): pass
class Connector(Feature): pass
class ConnectionPointReference(Vertex): pass
class MessageEnd(NamedElement): pass
class EventOccurrence(InteractionFragment, MessageEnd): pass
class ExecutionOccurence(InteractionFragment): pass
class DataType(Classifier): pass
class ObjectFlow(ActivityEdge): pass
class ActivityParameterNode(ObjectNode): pass
class OpaqueExpression(ValueSpecification): pass
class PrimitiveType(DataType): pass
class InstanceValue(ValueSpecification): pass
class ActivityFinalNode(FinalNode): pass
class Lifeline(NamedElement): pass
class ExecutionEnvironment(Node): pass
class DecisionNode(ControlNode): pass
class Usage(Dependency): pass
class OutputPin(Pin): pass
class ForkNode(ControlNode): pass
class ExtensionEnd(Property): pass
class LiteralString(LiteralSpecification): pass
class StateInvariant(InteractionFragment): pass
class Enumeration(DataType): pass
class Profile(Package): pass
class LiteralNull(LiteralSpecification): pass
class Stop(EventOccurrence): pass
LiteralInteger.value = attribute('value', int)
LiteralSpecification.value = attribute('value', object)
StructuralFeature.isReadOnly = attribute('isReadOnly', int, default=False)
BehavioralFeature.isAbstract = attribute('isAbstract', int)
RedefinableElement.isLeaf = attribute('isLeaf', int, default=True)
Expression.symbol = attribute('symbol', str)
Classifier.isAbstract = attribute('isAbstract', int, default=False)
Action.effect = attribute('effect', str)
Extension.isRequired = attribute('isRequired', int)
JoinNode.isCombineDuplicate = attribute('isCombineDuplicate', int, default=True)
NamedElement.visibility = enumeration('visibility', ('public', 'private', 'package', 'protected'), 'public')
NamedElement.name = attribute('name', str)
Pseudostate.kind = enumeration('kind', ('initial', 'deepHistory', 'shallowHistory', 'join', 'fork', 'junction', 'choice', 'entryPoint', 'exitPoint', 'terminate'), 'initial')
Comment.body = attribute('body', str)
TaggedValue.key = attribute('key', str)
Generalization.isSubstitutable = attribute('isSubstitutable', int)
ObjectNode.ordering = enumeration('ordering', ('unordered', 'ordered', 'LIFO', 'FIFO'), 'FIFO')
ObjectNode.isControlType = attribute('isControlType', int, default=False)
LiteralBoolean.value = attribute('value', int)
Transition.kind = enumeration('kind', ('internal', 'local', 'external'), 'internal')
PackageableElement.visibility = enumeration('visibility', ('public', 'private', 'package', 'protected'), 'public')
ElementImport.visibility = enumeration('visibility', ('public', 'private', 'package', 'protected'), 'public')
ElementImport.alias = attribute('alias', str)
Parameter.direction = enumeration('direction', ('inout', 'in', 'out', 'return'), 'in')
Component.isIndirectlyInstantiated = attribute('isIndirectlyInstantiated', int, default=True)
LiteralUnlimitedNatural.value = attribute('value', int)
Operation.isQuery = attribute('isQuery', int, default=False)
Message.messageSort = enumeration('messageSort', ('synchCall', 'synchSignal', 'asynchCall', 'asynchSignal'), 'synchCall')
Property.aggregation = enumeration('aggregation', ('none', 'shared', 'composite'), 'none')
Property.isDerivedUnion = attribute('isDerivedUnion', int, default=False)
Property.isDerived = attribute('isDerived', int, default=False)
Property.isComposite = property(lambda self: self.aggregation == intern('composite'))
Property.isReadOnly = attribute('isReadOnly', int, default=False)
Activity.body = attribute('body', str)
Activity.language = attribute('language', str)
Connector.kind = enumeration('kind', ('assembly', 'delegation'), 'assembly')
PackageImport.visibility = enumeration('visibility', ('public', 'private', 'package', 'protected'), 'public')
OpaqueExpression.language = attribute('language', str)
OpaqueExpression.body = attribute('body', str)
Feature.isStatic = attribute('isStatic', int, default=False)
Association.isDerived = attribute('isDerived', int, default=False)
Behavior.isReentrant = attribute('isReentrant', int)
LiteralString.value = attribute('value', str)
# Make it watch MultiplicityElement.lowerValue.value
def _get(self):
    return self.lowerValue and self.lowerValue.value
def _set(self, value):
    if not self.lowerValue:
        self.lowerValue = self._factory.create(LiteralString)
    self.lowerValue.value = value
def _del(self):
    if self.lowerValue:
        del self.lowerValue.value

MultiplicityElement.lower = property(_get, _set, _del)
del _get, _set, _del
# TODO: let it also emit notifications
# A notifier should be connected on instantiation of the lowerValue element.
# - this should be done on creation of the lowerValue, hence we should
#   add a notifier when self.lowerValue changes.
# - This requires some extra code to be executed on creation of our
#   MultiplicityElement. This can be done either in the Element or the
#   ElementFactory.
MultiplicityElement.isUnique = attribute('isUnique', int, default=True)
MultiplicityElement.isOrdered = attribute('isOrdered', int, default=True)
# Make it watch MultiplicityElement.upperValue.value
def _get(self):
    return self.upperValue and self.upperValue.value
def _set(self, value):
    if not self.upperValue:
        self.upperValue = self._factory.create(LiteralString)
    self.upperValue.value = value
def _del(self):
    if self.upperValue:
        del self.upperValue.value

MultiplicityElement.upper = property(_get, _set, _del)
del _get, _set, _del
Connector.redefinedConnector = association('redefinedConnector', Connector)
BehavioralFeature.method = association('method', Behavior)
Operation.precondition = association('precondition', Constraint, composite=True)
Realization.abstraction = association('abstraction', Component, upper=1, opposite='realization')
Component.realization = association('realization', Realization, composite=True, opposite='abstraction')
Artifact.manifestation = association('manifestation', Manifestation, composite=True)
ConnectorEnd.role = association('role', ConnectableElement, upper=1, opposite='end')
ConnectableElement.end = association('end', ConnectorEnd, opposite='role')
Parameter.defaultValue = association('defaultValue', ValueSpecification, upper=1, composite=True)
ValuePin.value_ = association('value_', ValueSpecification, lower=1, upper=1, composite=True)
ExtensionPoint.useCase = association('useCase', UseCase, lower=1, upper=1, opposite='extensionPoint')
UseCase.extensionPoint = association('extensionPoint', ExtensionPoint, opposite='useCase')
Region.subvertex = association('subvertex', Vertex, composite=True, opposite='container')
Vertex.container = association('container', Region, upper=1, opposite='subvertex')
State.exit = association('exit', Behavior, upper=1, composite=True)
Class.nestedClassifier = association('nestedClassifier', Classifier, composite=True)
Slot.value = association('value', ValueSpecification, composite=True)
Message.interaction = association('interaction', Interaction, lower=1, upper=1, opposite='message')
Interaction.message = association('message', Message, composite=True, opposite='interaction')
Package.ownedDiagram = association('ownedDiagram', Diagram, composite=True, opposite='package')
Diagram.package = association('package', Package, upper=1, opposite='ownedDiagram')
Include.includingCase = association('includingCase', UseCase, lower=1, upper=1, opposite='include')
UseCase.include = association('include', Include, composite=True, opposite='includingCase')
ConnectionPointReference.entry = association('entry', Pseudostate)
Extension.ownedEnd = association('ownedEnd', ExtensionEnd, lower=1, upper=1, composite=True)
Include.addition = association('addition', UseCase, lower=1, upper=1)
Transition.guard = association('guard', Constraint, upper=1, composite=True)
BehavioralFeature.raisedException = association('raisedException', Type)
Lifeline.coveredBy = association('coveredBy', InteractionFragment, opposite='covered')
InteractionFragment.covered = association('covered', Lifeline, lower=1, upper=1, opposite='coveredBy')
InstanceValue.instance = association('instance', InstanceSpecification, lower=1, upper=1)
Lifeline.interaction = association('interaction', Interaction, lower=1, upper=1, opposite='lifeline')
Interaction.lifeline = association('lifeline', Lifeline, composite=True, opposite='interaction')
Pseudostate.state = association('state', State, upper=1)
Property.datatype = association('datatype', DataType, upper=1, opposite='ownedAttribute')
DataType.ownedAttribute = association('ownedAttribute', Property, composite=True, opposite='datatype')
Message.argument = association('argument', ValueSpecification, composite=True)
Realization.realizingClassifier = association('realizingClassifier', Classifier, lower=1, upper=1)
Package.nestedPackage = association('nestedPackage', Package, composite=True, opposite='package')
Package.package = association('package', Package, upper=1, opposite='nestedPackage')
Property.defaultValue = association('defaultValue', ValueSpecification, upper=1, composite=True)
TypedElement.type = association('type', Type, upper=1)
Constraint.specification = association('specification', ValueSpecification, lower=1, upper=1, composite=True)
Extend.extension = association('extension', UseCase, lower=1, upper=1, opposite='extend')
UseCase.extend = association('extend', Extend, composite=True, opposite='extension')
Constraint.constrainedElement = association('constrainedElement', Element)
StructuredClassifier.ownedAttribute = association('ownedAttribute', Property, composite=True)
MessageEnd.sendMessage = association('sendMessage', Message, upper=1, opposite='sendEvent')
Message.sendEvent = association('sendEvent', MessageEnd, upper=1, composite=True, opposite='sendMessage')
Region.state = association('state', State, upper=1)
Profile.metamodelReference = association('metamodelReference', PackageImport, composite=True)
PackageMerge.mergedPackage = association('mergedPackage', Package, lower=1, upper=1)
Message.signature = association('signature', NamedElement, upper=1)
Namespace.ownedRule = association('ownedRule', Constraint, composite=True)
Class.ownedOperation = association('ownedOperation', Operation, composite=True, opposite='class_')
Operation.class_ = association('class_', Class, upper=1, opposite='ownedOperation')
ExecutionOccurence.start = association('start', EventOccurrence, lower=1, upper=1, opposite='startExec')
EventOccurrence.startExec = association('startExec', ExecutionOccurence, opposite='start')
StructuredClassifier.ownedConnector = association('ownedConnector', Connector, composite=True)
Property.interface_ = association('interface_', Interface, upper=1, opposite='ownedAttribute')
Interface.ownedAttribute = association('ownedAttribute', Property, composite=True, opposite='interface_')
InteractionFragment.generalOrdering = association('generalOrdering', GeneralOrdering, composite=True)
Activity.action = association('action', Action, composite=True)
Namespace.elementImport = association('elementImport', ElementImport, composite=True, opposite='importingNamespace')
ElementImport.importingNamespace = association('importingNamespace', Namespace, upper=1, opposite='elementImport')
NamedElement.clientDependency = association('clientDependency', Dependency, opposite='client')
Dependency.client = association('client', NamedElement, lower=1, opposite='clientDependency')
StateMachine.region = association('region', Region, lower=1, composite=True, opposite='stateMachine')
Region.stateMachine = association('stateMachine', StateMachine, upper=1, opposite='region')
Transition.effect = association('effect', Behavior, upper=1, composite=True)
Element.presentation = association('presentation', Presentation, composite=True, opposite='subject')
Presentation.subject = association('subject', Element, upper=1, opposite='presentation')
MessageEnd.receiveMessage = association('receiveMessage', Message, upper=1, opposite='receiveEvent')
Message.receiveEvent = association('receiveEvent', MessageEnd, upper=1, composite=True, opposite='receiveMessage')
TypedElement.typeValue = association('typeValue', ValueSpecification, upper=1, composite=True)
StateMachine.extendedStateMachine = association('extendedStateMachine', StateMachine, upper=1)
Element.appliedStereotype = association('appliedStereotype', Stereotype)
Dependency.supplier = association('supplier', NamedElement, lower=1, opposite='supplierDependency')
NamedElement.supplierDependency = association('supplierDependency', Dependency, opposite='supplier')
Enumeration.literal = association('literal', EnumerationLiteral, composite=True, opposite='enumeration')
EnumerationLiteral.enumeration = association('enumeration', Enumeration, upper=1, opposite='literal')
Profile.metaclassReference = association('metaclassReference', ElementImport, composite=True)
Class.ownedAttribute = association('ownedAttribute', Property, composite=True, opposite='class_')
Property.class_ = association('class_', Class, upper=1, opposite='ownedAttribute')
Substitution.contract = association('contract', Classifier, lower=1, upper=1)
Property.association = association('association', Association, upper=1, opposite='memberEnd')
Association.memberEnd = association('memberEnd', Property, lower=2, opposite='association')
DataType.ownedOperation = association('ownedOperation', Operation, composite=True, opposite='datatype')
Operation.datatype = association('datatype', DataType, upper=1, opposite='ownedOperation')
MultiplicityElement.lowerValue = association('lowerValue', ValueSpecification, upper=1, composite=True)
InstanceSpecification.classifier = association('classifier', Classifier)
Interface.nestedInterface = association('nestedInterface', Interface, composite=True)
Abstraction.mapping = association('mapping', Expression, lower=1, upper=1, composite=True)
ActivityEdge.source = association('source', ActivityNode, lower=1, upper=1, opposite='outgoing')
ActivityNode.outgoing = association('outgoing', ActivityEdge, opposite='source')
DecisionNode.decisionInput = association('decisionInput', Behavior, upper=1)
Activity.edge = association('edge', ActivityEdge, composite=True, opposite='activity')
ActivityEdge.activity = association('activity', Activity, upper=1, opposite='edge')
InteractionFragment.enclosingInteraction = association('enclosingInteraction', Interaction, upper=1, opposite='fragment')
Interaction.fragment = association('fragment', InteractionFragment, opposite='enclosingInteraction')
Extend.extendedCase = association('extendedCase', UseCase, lower=1, upper=1)
Property.redefinedProperty = association('redefinedProperty', Property)
State.statevariant = association('statevariant', Constraint, upper=1, composite=True, opposite='owningState')
Constraint.owningState = association('owningState', State, upper=1, opposite='statevariant')
StateInvariant.invariant = association('invariant', Constraint, lower=1, upper=1, composite=True)
JoinNode.joinSpec = association('joinSpec', ValueSpecification, lower=1, upper=1, composite=True)
Classifier.generalization = association('generalization', Generalization, composite=True, opposite='specific')
Generalization.specific = association('specific', Classifier, lower=1, upper=1, opposite='generalization')
Extend.extensionLocation = association('extensionLocation', ExtensionPoint, lower=1)
Operation.redefinedOperation = association('redefinedOperation', Operation)
ConnectionPointReference.state = association('state', State, upper=1)
Behavior.context = association('context', BehavioredClassifier, upper=1, opposite='ownedBehavior')
BehavioredClassifier.ownedBehavior = association('ownedBehavior', Behavior, composite=True, opposite='context')
Generalization.general = association('general', Classifier, lower=1, upper=1)
Extend.constraint = association('constraint', Constraint, upper=1, composite=True)
ActivityParameterNode.parameter = association('parameter', Parameter, lower=1, upper=1)
Transition.container = association('container', Region, lower=1, upper=1)
ActivityNode.incoming = association('incoming', ActivityEdge, opposite='target')
ActivityEdge.target = association('target', ActivityNode, lower=1, upper=1, opposite='incoming')
Connector.contract = association('contract', Behavior)
ExecutionOccurence.behavior = association('behavior', Behavior)
GeneralOrdering.before = association('before', EventOccurrence, lower=1, upper=1, opposite='toAfter')
EventOccurrence.toAfter = association('toAfter', GeneralOrdering, opposite='before')
Connector.end = association('end', ConnectorEnd, lower=2, composite=True)
Connector.type = association('type', Association, upper=1)
Operation.postcondition = association('postcondition', Constraint, composite=True)
State.submachine = association('submachine', StateMachine, upper=1)
Slot.definedFeature = association('definedFeature', StructuralFeature, lower=1, upper=1)
Property.actor = association('actor', Actor, upper=1, opposite='ownedAttribute')
Actor.ownedAttribute = association('ownedAttribute', Property, composite=True, opposite='actor')
Classifier.ownedUseCase = association('ownedUseCase', UseCase, composite=True)
ProfileApplication.importedProfile = association('importedProfile', Profile, lower=1, upper=1)
Profile.ownedStereotype = association('ownedStereotype', Stereotype, composite=True)
Namespace.packageImport = association('packageImport', PackageImport, composite=True, opposite='importingNamespace')
PackageImport.importingNamespace = association('importingNamespace', Namespace, upper=1, opposite='packageImport')
ElementImport.importedElement = association('importedElement', PackageableElement, lower=1, upper=1)
Behavior.redefinedBehavior = association('redefinedBehavior', Behavior)
State.doActivity = association('doActivity', Behavior, upper=1, composite=True)
MultiplicityElement.upperValue = association('upperValue', ValueSpecification, upper=1, composite=True)
Parameter.ownerReturnParam = association('ownerReturnParam', BehavioralFeature, upper=1, opposite='returnResult')
BehavioralFeature.returnResult = association('returnResult', Parameter, composite=True, opposite='ownerReturnParam')
Pseudostate.stateMachine = association('stateMachine', StateMachine, upper=1)
PackageMerge.mergingPackage = association('mergingPackage', Package, lower=1, upper=1, opposite='packageExtension')
Package.packageExtension = association('packageExtension', PackageMerge, composite=True, opposite='mergingPackage')
Lifeline.discriminator = association('discriminator', Expression, upper=1, composite=True)
Expression.operand = association('operand', ValueSpecification, composite=True)
NamedElement.taggedValue = association('taggedValue', ValueSpecification, composite=True)
Activity.group = association('group', ActivityGroup, composite=True, opposite='activity')
ActivityGroup.activity = association('activity', Activity, upper=1, opposite='group')
ConnectionPointReference.exit = association('exit', Pseudostate)
ActivityGroup.edgeContents = association('edgeContents', ActivityEdge, opposite='inGroup')
ActivityEdge.inGroup = association('inGroup', ActivityGroup, opposite='edgeContents')
Interface.ownedOperation = association('ownedOperation', Operation, composite=True, opposite='interface_')
Operation.interface_ = association('interface_', Interface, upper=1, opposite='ownedOperation')
State.entry = association('entry', Behavior, upper=1, composite=True)
ActivityEdge.guard = association('guard', ValueSpecification, lower=1, upper=1, composite=True)
Package.ownedClassifier = association('ownedClassifier', Type, composite=True, opposite='package')
Type.package = association('package', Package, upper=1, opposite='ownedClassifier')
Classifier.redefinedClassifier = association('redefinedClassifier', Classifier)
Element.ownedComment = association('ownedComment', Comment, opposite='annotatedElement')
Comment.annotatedElement = association('annotatedElement', Element, opposite='ownedComment')
Slot.owningInstance = association('owningInstance', InstanceSpecification, lower=1, upper=1, opposite='slot')
InstanceSpecification.slot = association('slot', Slot, composite=True, opposite='owningInstance')
Package.appliedProfile = association('appliedProfile', ProfileApplication, composite=True)
ObjectNode.upperBound = association('upperBound', ValueSpecification, lower=1, upper=1, composite=True)
BehavioralFeature.formalParameter = association('formalParameter', Parameter, composite=True, opposite='ownerFormalParam')
Parameter.ownerFormalParam = association('ownerFormalParam', BehavioralFeature, upper=1, opposite='formalParameter')
Property.subsettedProperty = association('subsettedProperty', Property)
InstanceSpecification.specification = association('specification', ValueSpecification, upper=1, composite=True)
Activity.node = association('node', ActivityNode, composite=True)
Operation.bodyCondition = association('bodyCondition', Constraint, upper=1, composite=True)
Property.owningAssociation = association('owningAssociation', Association, upper=1, opposite='ownedEnd')
Association.ownedEnd = association('ownedEnd', Property, composite=True, opposite='owningAssociation')
Substitution.substitutingClassifier = association('substitutingClassifier', Classifier, lower=1, upper=1, opposite='substitution')
Classifier.substitution = association('substitution', Substitution, composite=True, opposite='substitutingClassifier')
ExecutionOccurence.finish = association('finish', EventOccurrence, lower=1, upper=1, opposite='finishExec')
EventOccurrence.finishExec = association('finishExec', ExecutionOccurence, opposite='finish')
ObjectNode.selection = association('selection', Behavior, upper=1)
Operation.raisedException = association('raisedException', Type)
PackageImport.importedPackage = association('importedPackage', Package, lower=1, upper=1)
ActivityGroup.nodeContents = association('nodeContents', ActivityNode, opposite='inGroup')
ActivityNode.inGroup = association('inGroup', ActivityGroup, opposite='nodeContents')
GeneralOrdering.after = association('after', EventOccurrence, lower=1, upper=1, opposite='toBefore')
EventOccurrence.toBefore = association('toBefore', GeneralOrdering, opposite='after')
UseCase.subject = association('subject', Classifier)
Interface.redefinedInterface = association('redefinedInterface', Interface)
UseCase.ownedAttribute = association('ownedAttribute', Property, composite=True, opposite='useCase')
Property.useCase = association('useCase', UseCase, upper=1, opposite='ownedAttribute')
ExtensionEnd.type = association('type', Stereotype, lower=1, upper=1)
Property.classifier = derivedunion('classifier', 0, 1, Property.useCase, Property.actor, Property.interface_, Property.datatype, Property.class_)
Transition.redefintionContext = derivedunion('redefintionContext', 1, 1)
RedefinableElement.redefinitionContext = derivedunion('redefinitionContext', 0, '*', Property.classifier, Operation.datatype, Transition.redefintionContext, Operation.class_)
Classifier.attribute = derivedunion('attribute', 0, '*', Interface.ownedAttribute, UseCase.ownedAttribute, Actor.ownedAttribute, Class.ownedAttribute, DataType.ownedAttribute)
Namespace.ownedMember = derivedunion('ownedMember', 0, '*', Interface.ownedOperation, UseCase.extensionPoint, Package.ownedClassifier, Enumeration.literal, Package.ownedDiagram, Region.subvertex, Interface.ownedAttribute, Namespace.ownedRule, Package.nestedPackage, Operation.bodyCondition, BehavioredClassifier.ownedBehavior, UseCase.ownedAttribute, StateInvariant.invariant, Operation.postcondition, Extend.constraint, DataType.ownedOperation, Operation.precondition, Actor.ownedAttribute, BehavioralFeature.returnResult, Interaction.lifeline, Profile.ownedStereotype, Class.nestedClassifier, Class.ownedAttribute, Classifier.ownedUseCase, BehavioralFeature.formalParameter, Interaction.message, StateMachine.region, DataType.ownedAttribute, Class.ownedOperation, Association.ownedEnd)
def classifier_general(self):
    return [g.general for g in self.generalization]

Classifier.general = property(classifier_general, doc="")
del classifier_general
ActivityGroup.superGroup = derivedunion('superGroup', 0, 1)
NamedElement.namespace = derivedunion('namespace', 0, 1, Diagram.package, Property.owningAssociation, Property.useCase, Lifeline.interaction, Parameter.ownerReturnParam, Region.state, Property.actor, Operation.datatype, Type.package, Property.interface_, Property.datatype, Pseudostate.stateMachine, Vertex.container, ConnectionPointReference.state, Region.stateMachine, Property.class_, Message.interaction, Operation.interface_, EnumerationLiteral.enumeration, Package.package, Transition.container, Parameter.ownerFormalParam, Operation.class_)
Element.owner = derivedunion('owner', 0, 1, Realization.abstraction, ActivityEdge.activity, ActivityGroup.superGroup, Slot.owningInstance, NamedElement.namespace, PackageImport.importingNamespace, PackageMerge.mergingPackage, ElementImport.importingNamespace, ActivityGroup.activity, Pseudostate.state)
DirectedRelationship.target = derivedunion('target', 1, '*', Extend.extendedCase, Realization.realizingClassifier, PackageImport.importedPackage, Substitution.contract, PackageMerge.mergedPackage, Generalization.general, Include.addition, ElementImport.importedElement)
DirectedRelationship.source = derivedunion('source', 1, '*', Extend.extension, Realization.abstraction, Substitution.substitutingClassifier, PackageImport.importingNamespace, PackageMerge.mergingPackage, Include.includingCase, ElementImport.importingNamespace)
Relationship.relatedElement = derivedunion('relatedElement', 1, '*', DirectedRelationship.target, DirectedRelationship.source)
Classifier.inheritedMember = derivedunion('inheritedMember', 0, '*')

def property_opposite(self):
    """In the case where the property is one navigable end of a binary
    association with both ends navigable, this gives the other end.

    For Gaphor the property on the other end is returned regardless the
    navigability.
    """
    #if not self.owningAssociation and len(self.association.memberEnd) == 2:
    #    other_end = self.association.memberEnd[0] is self \
    #                and self.association.memberEnd[1] \
    #                or self.association.memberEnd[0]
    #    return other_end
    if self.association is not None and len(self.association.memberEnd) == 2:
        return self.association.memberEnd[0] is self \
               and self.association.memberEnd[1] \
               or self.association.memberEnd[0]
    return None

Property.opposite = property(property_opposite, doc=property_opposite.__doc__)

del property_opposite

ActivityGroup.superGroup = derivedunion('superGroup', 0, 1)
Classifier.feature = derivedunion('feature', 0, '*', StructuredClassifier.ownedConnector, Interface.ownedOperation, UseCase.extensionPoint, DataType.ownedOperation, Classifier.attribute, Class.ownedOperation, Association.ownedEnd)
StructuredClassifier.role = derivedunion('role', 0, '*', StructuredClassifier.ownedAttribute)
BehavioralFeature.parameter = derivedunion('parameter', 0, '*', BehavioralFeature.returnResult, BehavioralFeature.formalParameter)
Namespace.member = derivedunion('member', 0, '*', StructuredClassifier.role, Association.memberEnd, BehavioralFeature.parameter, Classifier.inheritedMember, Namespace.ownedMember)
DirectedRelationship.source = derivedunion('source', 1, '*', Extend.extension, Realization.abstraction, Substitution.substitutingClassifier, PackageImport.importingNamespace, PackageMerge.mergingPackage, Include.includingCase, ElementImport.importingNamespace)
Feature.featuringClassifier = derivedunion('featuringClassifier', 1, '*', Property.owningAssociation, Operation.datatype, Property.datatype, Property.class_, Operation.interface_, Operation.class_)
StructuredClassifier.role = derivedunion('role', 0, '*', StructuredClassifier.ownedAttribute)
Action.input = derivedunion('input', 0, '*')
Operation.type = derivedunion('type', 0, 1)
Action.output = derivedunion('output', 0, '*')
ActivityGroup.subgroup = derivedunion('subgroup', 0, '*')
Element.ownedElement = derivedunion('ownedElement', 0, '*', Expression.operand, Constraint.specification, Namespace.packageImport, Element.ownedComment, Activity.group, Lifeline.discriminator, ObjectNode.upperBound, MultiplicityElement.upperValue, Transition.guard, Package.packageExtension, State.entry, Substitution.contract, Action.input, InteractionFragment.generalOrdering, MultiplicityElement.lowerValue, Message.argument, InstanceSpecification.specification, Classifier.generalization, State.exit, ActivityEdge.guard, NamedElement.taggedValue, Slot.value, Namespace.ownedMember, Parameter.defaultValue, Interaction.fragment, State.statevariant, Namespace.elementImport, Action.output, Activity.edge, Property.defaultValue, ActivityGroup.subgroup, TypedElement.typeValue, State.doActivity, Connector.end, Transition.effect, Abstraction.mapping, Component.realization, JoinNode.joinSpec, Artifact.manifestation, Activity.node)
ConnectorEnd.definingEnd = derivedunion('definingEnd', 0, 1)
RedefinableElement.redefinedElement = derivedunion('redefinedElement', 0, '*', Property.redefinedProperty, Connector.redefinedConnector, Operation.redefinedOperation, Interface.redefinedInterface, Behavior.redefinedBehavior, Classifier.redefinedClassifier)
Action.context_ = derivedunion('context_', 0, 1)
def component_provided(self):
    from gaphor.UML.util import pr_interface_deps, pr_rc_interface_deps
    import itertools

    implementations = (impl.contract[0] for impl in self.implementation if impl.isKindOf(Implementation))
    realizations = pr_interface_deps(self, Realization)

    # realizing classifiers realizations
    # this generator of generators, so flatten it later
    rc_realizations = pr_rc_interface_deps(self, Realization)

    return tuple(set(itertools.chain(implementations, realizations, *rc_realizations)))

Component.provided = property(component_provided, doc = \
    """
    Interfaces provided to component environment. 
    """)
del component_provided
Namespace.importedMember = derivedunion('importedMember', 0, '*')
StructuredClassifier.part = derivedunion('part', 0, '*')

Association.endType = property(lambda self: [end.type for end in self.memberEnd if end], doc=\
    """References the classifiers that are used as types of the ends of the
    association.""")

def extension_metaclass(self):
    ownedEnd = self.ownedEnd
    return [c for c in self.memberEnd if c not in ownedEnd][0].type

Extension.metaclass = property(extension_metaclass, doc=\
    """References the Class that is extended through an Extension. The
    property is derived from the type of the memberEnd that is not the
    ownedEnd.""")
del extension_metaclass
DirectedRelationship.target = derivedunion('target', 1, '*', Extend.extendedCase, Realization.realizingClassifier, PackageImport.importedPackage, Substitution.contract, PackageMerge.mergedPackage, Generalization.general, Include.addition, ElementImport.importedElement)
def class_extension(self):
    extension = []
    for e in self._factory.select(lambda e: e.isKindOf(Extension) and self in e.endType):

        extension.append(e)
    return extension

Class.extension = property(class_extension, doc=\
    """References the Extensions that specify additional properties of the
    metaclass. The property is derived from the extensions whose memberEnds
    are typed by the Class.""")
del class_extension
BehavioralFeature.parameter = derivedunion('parameter', 0, '*', BehavioralFeature.returnResult, BehavioralFeature.formalParameter)
Transition.redefintionContext = derivedunion('redefintionContext', 1, 1)
def component_required(self):
    from gaphor.UML.util import pr_interface_deps, pr_rc_interface_deps
    import itertools

    usages = pr_interface_deps(self, Usage)

    # realizing classifiers usages
    # this generator of generators, so flatten it later
    rc_usages = pr_rc_interface_deps(self, Usage)

    return tuple(set(itertools.chain(usages, *rc_usages)))

Component.required = property(component_required, doc = \
    """
    Interfaces required by component. 
    """)
del component_required

Constraint.context = derivedunion('context', 0, 1)
Action.output = derivedunion('output', 0, '*')
NamedElement.namespace = derivedunion('namespace', 0, 1, Diagram.package, Property.owningAssociation, Property.useCase, Lifeline.interaction, Parameter.ownerReturnParam, Region.state, Property.actor, Operation.datatype, Type.package, Property.interface_, Property.datatype, Pseudostate.stateMachine, Vertex.container, ConnectionPointReference.state, Region.stateMachine, Property.class_, Message.interaction, Operation.interface_, EnumerationLiteral.enumeration, Package.package, Transition.container, Parameter.ownerFormalParam, Operation.class_)
Property.classifier = derivedunion('classifier', 0, 1, Property.useCase, Property.actor, Property.interface_, Property.datatype, Property.class_)
ActivityGroup.subgroup = derivedunion('subgroup', 0, '*')
ActivityEdge.redefinedElement = redefine('redefinedElement', ActivityEdge, RedefinableElement.redefinedElement)
BehavioredClassifier.implementation = redefine('implementation', Implementation, NamedElement.clientDependency)
Implementation.implementatingClassifier = redefine('implementatingClassifier', BehavioredClassifier, Dependency.client)
Package.ownedMember = redefine('ownedMember', PackageableElement, Namespace.ownedMember)
Transition.redefinedTransition = redefine('redefinedTransition', Transition, RedefinableElement.redefinedElement)
Implementation.contract = redefine('contract', Interface, Dependency.supplier)
Parameter.operation = redefine('operation', Operation, Parameter.ownerFormalParam)
Operation.formalParameter = redefine('formalParameter', Parameter, BehavioralFeature.formalParameter)
ActivityNode.redefinedElement = redefine('redefinedElement', ActivityNode, RedefinableElement.redefinedElement)
Region.extendedRegion = redefine('extendedRegion', Region, RedefinableElement.redefinedElement)
Component.ownedMember = redefine('ownedMember', PackageableElement, Namespace.ownedMember)
Class.superClass = Classifier.general
State.redefinedState = redefine('redefinedState', State, RedefinableElement.redefinedElement)
from umllex import parse_operation
Operation.parse = parse_operation
del parse_operation
from umllex import render_operation
Operation.render = render_operation
del render_operation
from umllex import parse_property
Property.parse = parse_property
del parse_property
from umllex import render_property
Property.render = render_property
del render_property
from umllex import parse_lifeline
Lifeline.parse = parse_lifeline
del parse_lifeline
from umllex import render_lifeline
Lifeline.render = render_lifeline
del render_lifeline
