private void SetArgumentIsValid(Argument argument)
        {
            if (RequirePrefix && !argument.HasPrefix)
            {
                argument.IsValid = false;
                return;
            }

            bool allowedArgument = true;

            if (AllowedArguments.Count > 0 && argument.HasPrefix)
            {
                allowedArgument = AllowedArguments.Contains(argument);
            }

            switch (argument.ArgumentValue)
            {
            case ArgumentValue.None:
            case ArgumentValue.Optional:
            {
                argument.IsValid = allowedArgument;
                break;
            }

            case ArgumentValue.Required:
            {
                argument.IsValid = allowedArgument && !string.IsNullOrEmpty(argument.Value);
                break;
            }
            }
        }
        /// <summary>
        /// Add an allowed <see cref="Argument"/>.
        /// </summary>
        /// <param name="argument">The <see cref="Argument"/>.</param>
        public void AddAllowedArgument(Argument argument)
        {
            string argumentName = argument.Name;
            string parameter;

            GetArgumentNameWithoutPrefix(ref argumentName, out parameter);
            AllowedArguments.Add(new Argument(argumentName, argument.ArgumentValue, true));
        }
        // ReSharper restore InconsistentNaming
        #endregion

        #region Private Methods
        private Argument BuildArgument(string argumentName, bool hasPrefix)
        {
            Argument returnValue;

            if (AllowedArguments.Count > 0 && AllowedArguments.Contains(argumentName))
            {
                returnValue = AllowedArguments[argumentName].Clone();
            }
            else
            {
                returnValue = new Argument(argumentName, hasPrefix);
            }

            SetArgumentIsValid(returnValue);

            return(returnValue);
        }