public List <ObjectRootNamespace> ComputeObjectRoots()
        {
            List <ObjectRootNamespace> roots = new List <ObjectRootNamespace>();

            string[] objects = fileSystem.ReadInputFile();

            objects = RemoveIgnoredObjects(objects);
            objects = RemoveHashes(objects);

            //Setup all the namespaces for the objects
            foreach (string obj in objects)
            {
                string        rootNamespaces = GetNamespaceFromObj(obj);
                List <string> subNamespaces  = ExtractNamespaceComponents(obj);

                ObjectRootNamespace rootObj = CreateRootNamespace(ref roots, rootNamespaces);

                if (subNamespaces.Count > 0)
                {
                    PopulateRootNamespace(rootObj, subNamespaces);
                }

                rootObj.Objects.Add(obj);
            }

            return(roots);
        }
        private static void PopulateRootNamespace(ObjectRootNamespace root, List <string> namespaces)
        {
            //Manually apply the first sub namespace....
            ObjectNamespace targetSub = root.SubNamespaces.FirstOrDefault(ns => ns.Name == namespaces[0]);

            if (targetSub == null)
            {
                targetSub = new ObjectNamespace
                {
                    Name = namespaces[0]
                };

                root.SubNamespaces.Add(targetSub);
            }

            //Now recursively apply the namespaces for this object.
            List <string> adjustedSubNamespaces = namespaces.Skip(1).ToList();

            foreach (string subName in adjustedSubNamespaces)
            {
                ObjectNamespace newSub = targetSub.SubNamespaces.FirstOrDefault(ns => ns.Name == subName);

                if (newSub == null)
                {
                    newSub = new ObjectNamespace
                    {
                        Name = subName
                    };

                    targetSub.SubNamespaces.Add(newSub);
                }

                targetSub = newSub;
            }
        }