public virtual void SetReferenceTargetElement <TTarget>(ModelElementInstanceImpl referenceSourceParentElement, TTarget referenceTargetElement) where TTarget : IModelElementInstance
        {
            ModelInstanceImpl     modelInstance   = (ModelInstanceImpl)referenceSourceParentElement.ModelInstance;
            string                identifier      = ReferenceTargetAttribute.GetValue <String>(referenceTargetElement);
            IModelElementInstance existingElement = modelInstance.GetModelElementById(identifier);

            if (existingElement == null || !existingElement.Equals(referenceTargetElement))
            {
                throw new ModelReferenceException("Cannot create reference to model element " + referenceTargetElement + ": element is not part of model. Please connect element to the model first.");
            }
            TSource referenceSourceElement = modelInstance.NewInstance <TSource>(ReferenceSourceElementType);

            SetReferenceSource(referenceSourceParentElement, referenceSourceElement);
            SetReferenceIdentifier(referenceSourceElement, identifier);
        }
        protected internal virtual void PerformAddOperation(ModelElementInstanceImpl referenceSourceParentElement, IModelElementInstance referenceTargetElement)
        {
            ModelInstanceImpl     modelInstance             = (ModelInstanceImpl)referenceSourceParentElement.ModelInstance;
            string                referenceTargetIdentifier = ReferenceTargetAttribute.GetValue <String>(referenceTargetElement);
            IModelElementInstance existingElement           = modelInstance.GetModelElementById(referenceTargetIdentifier);

            if (existingElement == null || !existingElement.Equals(referenceTargetElement))
            {
                throw new ModelReferenceException("Cannot create reference to model element " + referenceTargetElement + ": element is not part of model. Please connect element to the model first.");
            }
            else
            {
                ICollection <TSource> referenceSourceElements = _referenceSourceCollection.Get <TSource>(referenceSourceParentElement);
                TSource referenceSourceElement = modelInstance.NewInstance <TSource>(_referenceSourceType);
                referenceSourceElements.Add(referenceSourceElement);
                SetReferenceIdentifier(referenceSourceElement, referenceTargetIdentifier);
            }
        }