///--------------------------------------------------------------------------------
        /// <summary>This property returns a copy of the forward engineering data for the solution.</summary>
        ///--------------------------------------------------------------------------------
        public SpecificationSource GetForwardInstance(Solution forwardSolution)
        {
            bool isCustomized = false;
            SpecificationSource forwardItem = new SpecificationSource();

            if (ForwardInstance != null)
            {
                forwardItem.TransformDataFromObject(ForwardInstance, null, false);
                isCustomized = true;
            }
            else if (IsAutoUpdated == false)
            {
                forwardItem.TransformDataFromObject(this, null, false);
                isCustomized = true;
            }
            else
            {
                forwardItem.SpecificationSourceID = SpecificationSourceID;
            }
            if (isCustomized == false)
            {
                return(null);
            }
            forwardItem.SpecSourceName = DefaultSourceName;
            if (forwardSolution.ReferencedModelIDs.Find("ItemName", forwardItem.SpecSourceName) == null)
            {
                forwardSolution.ReferencedModelIDs.Add(CreateIDReference());
            }

            #region protected
            #endregion protected

            return(forwardItem);
        }
        ///--------------------------------------------------------------------------------
        /// <summary>This method assigns a value to a property, and updates corresponding
        /// forward and reverse engineering data.</summary>
        ///
        /// <param name="propertyName">The property name.</param>
        /// <param name="propertyValue">The property value.</param>
        ///--------------------------------------------------------------------------------
        public virtual bool AssignProperty(string propertyName, object propertyValue)
        {
            if (this.SetPropertyValue(propertyName, propertyValue) == true)
            {
                if (ReverseInstance == null)
                {
                    ReverseInstance = new SpecificationSource();
                    ReverseInstance.TransformDataFromObject(this, null, false);
                }
                else
                {
                    ReverseInstance.SetPropertyValue(propertyName, propertyValue);
                }
                if (ForwardInstance != null)
                {
                    this.TransformDataFromObject(ForwardInstance, null, false, true);
                }
            }
            else
            {
                return(false);
            }

            #region protected
            #endregion protected

            return(true);
        }
        ///--------------------------------------------------------------------------------
        /// <summary>This method determines whether or not any metadata is
        /// different between the input instance and the current instance.</summary>
        ///
        /// <param name="inputSpecificationSource">The specificationsource to compare metadata.</param>
        ///--------------------------------------------------------------------------------
        public bool IsIdenticalMetadata(SpecificationSource inputSpecificationSource)
        {
            if (SolutionID.GetGuid() != inputSpecificationSource.SolutionID.GetGuid())
            {
                return(false);
            }
            if (TemplatePath.GetString() != inputSpecificationSource.TemplatePath.GetString())
            {
                return(false);
            }
            if (Order.GetInt() != inputSpecificationSource.Order.GetInt())
            {
                return(false);
            }
            if (IsAutoUpdated.GetBool() != inputSpecificationSource.IsAutoUpdated.GetBool())
            {
                return(false);
            }
            if (Description.GetString() != inputSpecificationSource.Description.GetString())
            {
                return(false);
            }

            #region protected
            #endregion protected

            return(true);
        }
        ///--------------------------------------------------------------------------------
        /// <summary>This method copies changed metadata between the input
        /// instance and the current instance.</summary>
        ///
        /// <param name="inputSpecificationSource">The specificationsource to get metadata.</param>
        ///--------------------------------------------------------------------------------
        public void CopyChangedMetadata(SpecificationSource inputSpecificationSource)
        {
            SolutionID    = inputSpecificationSource.SolutionID;
            TemplatePath  = inputSpecificationSource.TemplatePath;
            Order         = inputSpecificationSource.Order;
            IsAutoUpdated = inputSpecificationSource.IsAutoUpdated;
            Description   = inputSpecificationSource.Description;

            #region protected
            #endregion protected
        }
 ///--------------------------------------------------------------------------------
 /// <summary>This method adds a tag to TagList.</summary>
 ///--------------------------------------------------------------------------------
 public override void AddTag(string tagName)
 {
     if (ReverseInstance == null && IsAutoUpdated == true)
     {
         ReverseInstance = new SpecificationSource();
         ReverseInstance.TransformDataFromObject(this, null, false);
         IsAutoUpdated = false;
     }
     base.AddTag(tagName);
     if (ForwardInstance == null)
     {
         ForwardInstance = new SpecificationSource();
         ForwardInstance.SpecificationSourceID = SpecificationSourceID;
     }
     if (ForwardInstance.TagList.Find(t => t.TagName == tagName) == null)
     {
         ForwardInstance.TagList.Add(new Tag(Guid.NewGuid(), tagName));
     }
 }
        ///--------------------------------------------------------------------------------
        /// <summary>This method determines whether the input instance metadata is
        /// effectively empty.</summary>
        ///
        /// <param name="inputSpecificationSource">The specificationsource to compare metadata.</param>
        ///--------------------------------------------------------------------------------
        public bool IsEmptyMetadata(SpecificationSource inputSpecificationSource)
        {
            if (inputSpecificationSource == null)
            {
                return(true);
            }
            if (inputSpecificationSource.TagList.Count > 0)
            {
                return(false);
            }
            if (SolutionID != inputSpecificationSource.SolutionID)
            {
                return(false);
            }
            if (!String.IsNullOrEmpty(inputSpecificationSource.TemplatePath))
            {
                return(false);
            }
            if (Order != DefaultValue.Int)
            {
                return(false);
            }
            if (IsAutoUpdated != inputSpecificationSource.IsAutoUpdated)
            {
                return(false);
            }
            if (!String.IsNullOrEmpty(inputSpecificationSource.Description))
            {
                return(false);
            }

            #region protected
            #endregion protected

            return(true);
        }