public IdentifiableItemBase(IIdentifiable itemInstance, IComposition composition)
        {
            Contract.Requires(itemInstance != null, "itemInstance != null");
            Contract.Requires(composition != null, "composition != null");

            _composition = composition;

            _guid = Guid.NewGuid().ToString();

            _cachedInstanceId = itemInstance.Id;
            _cachedInstanceDescribes = new Describes(itemInstance);

            _cachedCaptionEdited = false;
            _cachedDescriptionEdited = false;

            _itemInstance = itemInstance;

            _xConstructor = Constructor(itemInstance);
            _xConnectivity = Connectivity(itemInstance);

            if (itemInstance is IBaseLinkableComponentProposed)
                _platforms = ((IBaseLinkableComponentProposed)itemInstance).SupportedPlatforms;
            else if (itemInstance is IBaseExchangeItemProposed)
                _platforms = ((IBaseExchangeItemProposed)itemInstance).SupportedPlatforms;
            else
                _platforms = composition.Platforms;

            if (itemInstance is IBaseLinkableComponent)
                _interface = IdentifiableItemType.IBaseLinkableComponent;
            else if (itemInstance is IBaseAdaptedOutput)
                _interface = IdentifiableItemType.IBaseAdaptedOutput;
            else if (itemInstance is IBaseOutput)
                _interface = IdentifiableItemType.IBaseOutput;
            else if (itemInstance is IBaseInput)
                _interface = IdentifiableItemType.IBaseInput;
            else if (itemInstance is IAdaptedOutputFactory)
                _interface = IdentifiableItemType.IAdaptedOutputFactory;
            else
                _interface = IdentifiableItemType.Unknown;
        }
        public virtual void Initialise(XElement xElement, IDocumentAccessor accessor)
        {
            xElement = Persistence.ThisOrSingleChild(XName, xElement);

            _guid = Utilities.Xml.GetAttribute(xElement, "id");
            _cachedInstanceId = Utilities.Xml.GetAttribute(xElement, "instanceId");

            var interfaceType = Utilities.Xml.GetAttribute(xElement, "interface");

            _cachedCaptionEdited = Utilities.Xml.GetAttribute(xElement, "captionEdited", false);
            _cachedDescriptionEdited = Utilities.Xml.GetAttribute(xElement, "descriptionEdited", false);

            var caption = Utilities.Xml.GetAttribute(xElement, "caption");

            var description = _cachedDescriptionEdited
                ? xElement.Element("Description").Value
                : "Description unavailable until ItemInstance(composition) accessed";

            _cachedInstanceDescribes = new Describes(caption, description);
            _cachedCaptionEdited = true;

            _xConstructor = Persistence.ThisOrSingleChild(XConstructor, xElement);
            _xConnectivity = Persistence.ThisOrSingleChild(XConnectivity, xElement);

            _platforms = Persistence.PlatformsChi.Parse(xElement, accessor);

            _interface = (IdentifiableItemType)Enum.Parse(typeof(IdentifiableItemType), interfaceType);
        }