/// <summary>
 /// Constructs a command
 /// </summary>
 /// <param name="name">Command name</param>
 /// <param name="description">Description</param>
 /// <param name="helpTopic">Help topic</param>
 /// <param name="onCommandExecuted">On command executed</param>
 /// <param name="arguments">Command arguments</param>
 public Command(string name, string description, string helpTopic, CommandExecutedDelegate onCommandExecuted, params CommandArgument[] arguments) : base(name)
 {
     if (onCommandExecuted == null)
     {
         throw new ArgumentNullException(nameof(onCommandExecuted));
     }
     Description        = description ?? throw new ArgumentNullException(nameof(description));
     HelpTopic          = helpTopic ?? throw new ArgumentNullException(nameof(helpTopic));
     OnCommandExecuted += onCommandExecuted;
     Arguments          = arguments ?? throw new ArgumentNullException(nameof(arguments));
 }
        /// <summary>
        /// Adds a command
        /// </summary>
        /// <param name="name">Command name</param>
        /// <param name="description">Description</param>
        /// <param name="helpTopic">Help topic</param>
        /// <param name="onCommandExecuted">On command executed</param>
        /// <param name="arguments">Arguments</param>
        /// <returns>Command if successful, otherwise "null"</returns>
        public ICommand AddCommand(string name, string description, string helpTopic, CommandExecutedDelegate onCommandExecuted, params CommandArgument[] arguments)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }
            if (description == null)
            {
                throw new ArgumentNullException(nameof(description));
            }
            if (helpTopic == null)
            {
                throw new ArgumentNullException(nameof(helpTopic));
            }
            if (onCommandExecuted == null)
            {
                throw new ArgumentNullException(nameof(onCommandExecuted));
            }
            if (arguments == null)
            {
                throw new ArgumentNullException(nameof(arguments));
            }
            ICommand ret          = null;
            string   trimmed_name = name.Trim().ToLower();

            if (!commandLookup.ContainsKey(trimmed_name))
            {
                ret = new Command(trimmed_name, description, helpTopic, onCommandExecuted, arguments);
                commandLookup.Add(trimmed_name, ret);
            }
            return(ret);
        }