public IEntityGraph <IEntityTypeDefinition> GetAll()
        {
            var elements = PackageXml.Element("umbPackage").Element("DocumentTypes").Elements("DocumentType");

            var returnVal = new EntityGraph <IEntityTypeDefinition>();

            foreach (var xElement in elements)
            {
                var xml = xElement;
                var id  = new StringIdentifier((string)xml.Element("Info").Element("Alias"), this.GetType().FullName);
                returnVal.Add(id, new Lazy <IEntityTypeDefinition>(() =>
                {
                    var info = xml.Element("Info");
                    var entityTypeDefinition = new DocType();
                    var root = new TypedEntityVertex().SetupRoot();
                    entityTypeDefinition.SetupTypeDefinition((string)info.Element("Alias"), (string)info.Element("Name"), root);
                    entityTypeDefinition.Id = id;

                    //find all the tabs so we can get the ID's off them
                    var tabs = xml.Element("Tabs").Elements("Tab");
                    foreach (var tab in tabs)
                    {
                        //get the repo to create the ID
                        var groupId = attributeGroupRepository.ResolveIdentifier((string)tab.Element("Caption"));
                        //resolve the group from the repo based on the ID schema
                        var group = attributeGroupRepository.Get(groupId);

                        //add the group to the attribute schema
                        entityTypeDefinition.AttributeSchema.AttributeGroupDefinitions.Add(group);
                    }

                    var properties = xml.Element("GenericProperties").Elements("GenericProperty");
                    foreach (var property in properties)
                    {
                        //TODO: Make this lazy, currently we're resolving all the attributes (and all its sub-graph) immediately...

                        //get the ID of the property using the repo to generate it
                        var attributeId = attributeRepository.ResolveIdentifier(entityTypeDefinition.Alias + "/" + (string)property.Element("Alias"));
                        //resolve the attribute
                        var attribute = attributeRepository.Get(attributeId);
                        //find the group that this attribute is associated with
                        var groupId = attributeGroupRepository.ResolveIdentifier((string)property.Element("Tab"));
                        var group   = attributeGroupRepository.Get(groupId);
                        //add this attribute to the group

                        group.AttributeDefinitions.Add(attribute);
                    }

                    return(entityTypeDefinition);
                }));
            }

            return(returnVal);
        }