public ISetup Clone()
        {
            SetupFolder folder = new SetupFolder();

            folder.Name = Name;
            folder.Icon = Icon;
            foreach (ISetup entry in Entries)
            {
                folder.Entries.Add(entry.Clone());
            }
            return(folder);
        }
        //=========== LOADING ============
        #region Loading

        public void Read <T>(XmlElement folder) where T : Setup
        {
            XmlNode    node;
            XmlElement element;

            Entries.Clear();

            if (Parent != null)
            {
                node = folder.SelectSingleNode("Name");
                if (node != null)
                {
                    Name = node.InnerText;
                }

                node = folder.SelectSingleNode("Details");
                if (node != null)
                {
                    Details = node.InnerText;
                }

                node = folder.SelectSingleNode("Icon");
                if (node != null)
                {
                    Icon = node.InnerText;
                }
            }

            foreach (XmlNode folderNode in folder)
            {
                element = folderNode as XmlElement;
                if (element != null)
                {
                    if (element.Name == "Folder")
                    {
                        SetupFolder subFolder = new SetupFolder(this);
                        subFolder.Read <T>(element);
                        Entries.Add(subFolder);
                    }
                    else if (element.Name == typeof(T).Name)
                    {
                        Setup setup = Activator.CreateInstance <T>();
                        setup.Read(element);
                        Entries.Add(setup);
                    }
                }
            }
        }
        public void Write <T>(XmlElement folder, XmlDocument doc)
        {
            XmlElement element;

            if (Parent != null)
            {
                element = doc.CreateElement("Name");
                element.AppendChild(doc.CreateTextNode(Name));
                folder.AppendChild(element);

                element = doc.CreateElement("Details");
                element.AppendChild(doc.CreateTextNode(Details));
                folder.AppendChild(element);

                element = doc.CreateElement("Icon");
                element.AppendChild(doc.CreateTextNode(Icon));
                folder.AppendChild(element);
            }

            foreach (ISetup entry in Entries)
            {
                if (entry is SetupFolder)
                {
                    SetupFolder subFolder        = (SetupFolder)entry;
                    XmlElement  subFolderElement = doc.CreateElement("Folder");
                    subFolder.Write <T>(subFolderElement, doc);
                    folder.AppendChild(subFolderElement);
                }
                else if (entry is Setup)
                {
                    Setup      setup        = (Setup)entry;
                    XmlElement setupElement = doc.CreateElement(typeof(T).Name);
                    setup.Write(setupElement, doc);
                    folder.AppendChild(setupElement);
                }
            }
        }
 public SetupFolder(SetupFolder parent)
 {
     Parent = parent;
 }