Source:
<code>public boolean parse(List<String> args) { parsedArgs = new HashMap<>(); errors = new ArrayList<>(); <START> while(!args.isEmpty()) { <END> String arg = args.get(0); if(!arg.startsWith(LONG_PREFIX)) { break; } arg = args.remove(0); if(arg.equals(LONG_PREFIX)) { break; } String[] argVal = parseArgument(arg.substring(2)); String key = argVal[0]; String value = argVal[1]; Argument argument = arguments.get(key); if(argument == null) { errors.add( new IllegalArgumentException(String.format("Invalid argument '%1$s'", arg)) ); } else { if ( value == null && ( argument.getType() == Argument.Type.OPTIONAL_ARGUMENT || argument.getType() == Argument.Type.HAS_ARGUMENT ) ) { if(args.size() > 0) { value = args.get(0); if (value.startsWith(LONG_PREFIX)) { value = null; } else { args.remove(0); } } } if (argument.getType() == Argument.Type.HAS_ARGUMENT && value == null) { errors.add( new IllegalArgumentException( String.format("Value is required, but missing for argument '%1$s'", key) ) ); } if (value == null) { value = argument.getValue(); } Object convertedValue = null; if (value != null) { Matcher m = argument.getMatcher().matcher(value); if (!m.find()) { errors.add( new IllegalArgumentException( String.format( "Pattern for argument '%1$s' does not match, pattern is '%2$s', value is '%3$s", key, m.pattern(), value ) ) ); } convertedValue = StringValueConverter.getObjectValueByString(argument.getConvert(), value); } putValue(parsedArgs, argument, convertedValue); } } fillDefaults(parsedArgs); List<String> mandatoryCopy = new ArrayList<String>(mandatory); mandatoryCopy.removeAll(parsedArgs.keySet()); if(!mandatoryCopy.isEmpty()) { errors.add( new IllegalArgumentException( String.format("Argument(s) '%1$s' required", StringUtils.join(mandatoryCopy, ", ")) ) ); } return errors.isEmpty(); }</code><technical_language>a bad behavior modify Collection provided caller. reimplement modification of args</technical_language>

Target:
public boolean parse(List<String> args) { parsedArgs = new HashMap<>(); errors = new ArrayList<>(); while(!args.isEmpty()) { String arg = args.get(0); if(!arg.startsWith(LONG_PREFIX)) { break; } arg = args.remove(0); if(arg.equals(LONG_PREFIX)) { break; } String[] argVal = parseArgument(arg.substring(2)); String key = argVal[0]; String value = argVal[1]; Argument argument = arguments.get(key); if(argument == null) { errors.add( new IllegalArgumentException(String.format("Invalid argument '%1$s'", arg)) ); } else { if ( value == null && ( argument.getType() == Argument.Type.OPTIONAL_ARGUMENT || argument.getType() == Argument.Type.HAS_ARGUMENT ) ) { if(args.size() > 0) { value = args.get(0); if (value.startsWith(LONG_PREFIX)) { value = null; } else { args.remove(0); } } } if (argument.getType() == Argument.Type.HAS_ARGUMENT && value == null) { errors.add( new IllegalArgumentException( String.format("Value is required, but missing for argument '%1$s'", key) ) ); } if (value == null) { value = argument.getValue(); } Object convertedValue = null; if (value != null) { Matcher m = argument.getMatcher().matcher(value); if (!m.find()) { errors.add( new IllegalArgumentException( String.format( "Pattern for argument '%1$s' does not match, pattern is '%2$s', value is '%3$s", key, m.pattern(), value ) ) ); } convertedValue = StringValueConverter.getObjectValueByString(argument.getValueType(), value); } putValue(parsedArgs, argument, convertedValue); } } fillDefaults(parsedArgs); List<String> mandatoryCopy = new ArrayList<String>(mandatory); mandatoryCopy.removeAll(parsedArgs.keySet()); if(!mandatoryCopy.isEmpty()) { errors.add( new IllegalArgumentException( String.format("Argument(s) '%1$s' required", StringUtils.join(mandatoryCopy, ", ")) ) ); } return errors.isEmpty(); }