/// <summary>
        /// Add a new command with names separated by folders/namespaces, last is command name, others are holders.
        /// These will be made as required
        /// during the add.
        /// </summary>
        /// <param name="names">separated command name e.g. Physics.gravity is now {"Physics","gravity"}</param>
        /// <param name="callback">action of the command to add</param>
        /// <param name="helpText">help text to show to user about the command</param>
        /// <param name="command_index">used in the recursion, indicates current depth in names array</param>
        public void Add(string[] names, Console.CommandCallback callback, string helpText, int command_index = 0)
        {
            if (names.Length == command_index)
            {
                Command = new ConsoleCommandData {
                    localName = names.Last(), callback = callback, help = helpText
                };
                return;
            }

            string token      = names[command_index];
            string lowerToken = token.ToLowerInvariant();

            if (!subCommandsLookUp.ContainsKey(lowerToken))
            {
                ConsoleCommandData data = new ConsoleCommandData
                {
                    localName = token
                };
                subCommandsLookUp[lowerToken] = new ConsoleCommandTreeNode(this, data);
            }
            subCommandsLookUp[lowerToken].Add(names, callback, helpText, command_index + 1);
        }
 protected ConsoleCommandTreeNode(ConsoleCommandTreeNode parent, ConsoleCommandData data)
 {
     parentNode = parent;
     Command    = data;
 }