@Override
    public ParserState onComplete() {
      if (getHasArgument() && values.isEmpty()) {
        throw new CommandLineArgumentException(
            String.format("No argument was provided for command-line option '%s'.", optionString));
      }

      ParsedCommandLineOption parsedOption = commandLine.addOption(optionString.option, option);
      if (values.size() + parsedOption.getValues().size() > 1
          && !option.getAllowsMultipleArguments()) {
        throw new CommandLineArgumentException(
            String.format(
                "Multiple arguments were provided for command-line option '%s'.", optionString));
      }
      for (String value : values) {
        parsedOption.addArgument(value);
      }
      if (option.getDeprecationWarning() != null) {
        deprecationPrinter.println(
            "The " + optionString + " option is deprecated - " + option.getDeprecationWarning());
      }

      for (CommandLineOption otherOption : option.getGroupWith()) {
        commandLine.removeOption(otherOption);
      }

      return state;
    }
 @Override
 public ParserState onNonOption(String arg) {
   commandLine.addExtraValue(arg);
   return allowMixedOptions
       ? new AfterFirstSubCommand(commandLine)
       : new AfterOptions(commandLine);
 }
 @Override
 public ParserState onComplete() {
   commandLine.addExtraValue(arg);
   return state;
 }
 @Override
 public ParserState onNonOption(String arg) {
   commandLine.addExtraValue(arg);
   return this;
 }