public static BlocksCollection FromXML(string source)
        {
            BlocksCollection blocks = new BlocksCollection();

            try {
                XDocument xml = XDocument.Parse(source);
                blocks.AddFromXML(xml.Root.Element("World"), Block.Roles.World);
                foreach (XElement input in xml.Root.Elements("Input"))
                {
                    blocks.AddFromXML(input, Block.Roles.In);
                }
                foreach (XElement output in xml.Root.Elements("Output"))
                {
                    blocks.AddFromXML(output, Block.Roles.Out);
                }
            }
            catch
            {
                blocks.Valid = false;
            }
            return(blocks);
        }