/// <summary>
        /// Copies the given elements to the dataObject.
        /// </summary>
        /// <param name="elements">Elements to copy.</param>
        /// <param name="dataObject">DataObject to add the data to.</param>
        /// <returns>DataObjects with the added data.</returns>
        public static IDataObject Copy(ICollection <ModelElement> elements, IDataObject dataObject)
        {
            Guid guid = Guid.NewGuid();

            ModelProtoGroup protoGroup = new ModelProtoGroup(elements, ModelProtoGroupOperation.Copy);

            dataObject.SetData(ModelProtoGroup.DefaultDataFormatName, protoGroup);
            dataObject.SetData(ModelProtoGroup.DefaultDataIdentifierName, guid);

            // update cached prototype
            cachedPrototype = new CachedModelProtoGroup(guid, protoGroup);
            return(dataObject);
        }
        /// <summary>
        /// Retrieves a model proto group from the given data object if one exists.
        /// </summary>
        /// <param name="dataObject">Data objects to retrieve a model proto group from.</param>
        /// <returns>ModelProtoGroup instance or null.</returns>
        public static ModelProtoGroup GetModelProtoGroup(IDataObject dataObject)
        {
            ModelProtoGroup group = null;

            if (dataObject.GetDataPresent(ModelProtoGroup.DefaultDataFormatName))
            {
                Guid guid = Guid.Empty;
                if (dataObject.GetDataPresent(ModelProtoGroup.DefaultDataIdentifierName))
                {
                    guid = (System.Guid)dataObject.GetData(ModelProtoGroup.DefaultDataIdentifierName);
                }

                if ((cachedPrototype != null) && guid == cachedPrototype.InstanceId)
                {
                    return(cachedPrototype.Prototype);
                }

                object obj = dataObject.GetData(ModelProtoGroup.DefaultDataFormatName);
                group           = obj as ModelProtoGroup;
                cachedPrototype = new CachedModelProtoGroup(guid, group);
            }

            return(group);
        }
        /// <summary>
        /// Retrieves a model proto group from the given data object if one exists.
        /// </summary>
        /// <param name="dataObject">Data objects to retrieve a model proto group from.</param>
        /// <returns>ModelProtoGroup instance or null.</returns>
        public static ModelProtoGroup GetModelProtoGroup(IDataObject dataObject)
        {
            ModelProtoGroup group = null;
            if (dataObject.GetDataPresent(ModelProtoGroup.DefaultDataFormatName))
            {
                Guid guid = Guid.Empty;
                if (dataObject.GetDataPresent(ModelProtoGroup.DefaultDataIdentifierName))
                    guid = (System.Guid)dataObject.GetData(ModelProtoGroup.DefaultDataIdentifierName);

                if ((cachedPrototype != null) && guid == cachedPrototype.InstanceId)
                    return cachedPrototype.Prototype;

                object obj = dataObject.GetData(ModelProtoGroup.DefaultDataFormatName);
                group = obj as ModelProtoGroup;
                cachedPrototype = new CachedModelProtoGroup(guid, group);
            }

            return group;
        }
        /// <summary>
        /// Copies the given elements to the dataObject.
        /// </summary>
        /// <param name="elements">Elements to copy.</param>
        /// <param name="dataObject">DataObject to add the data to.</param>
        /// <returns>DataObjects with the added data.</returns>
        public static IDataObject Copy(ICollection<ModelElement> elements, IDataObject dataObject)
        {
            Guid guid = Guid.NewGuid();

            ModelProtoGroup protoGroup = new ModelProtoGroup(elements, ModelProtoGroupOperation.Copy);
            dataObject.SetData(ModelProtoGroup.DefaultDataFormatName, protoGroup);
            dataObject.SetData(ModelProtoGroup.DefaultDataIdentifierName, guid);

            // update cached prototype
            cachedPrototype = new CachedModelProtoGroup(guid, protoGroup);
            return dataObject;
        }