code: public CommandArgs createCommandArgs() throws ParseException {
          // In case the last arg was a call-by-name , have that parameter parse a 'no-value' value.
          // Can only succeed in certain cases with certain parameters.
          if (nextNamedParam.isPresent()) {
              // The last parsed arg did indeed end with '-{paramName}' without assigning that parameter a value.
              final CliParam param = nextNamedParam.get();
              final Object arg = param.noValue();
              addArg(param, arg);
          }
  
          // Assign default values to any optional params not bound.
          resolveUnboundParams();
  
          final List<Object> commandArgs = new ArrayList<>(params.size());
          for (CliParam param : params) {
              final Object parsedValue = parsedValues.get(param);
              if (parsedValue == null && !param.isNullable()) {
                  // If there is a missing arg value at this point, this is an internal error.
                  throw new IllegalStateException("Internal Error: Not all params have been parsed! Missing=" + param);
              }
              commandArgs.add(parsedValue);
          }
          return new CommandArgsImpl(commandArgs);
      }
docs: Create {@link CommandArgs} out of this context's already parsed values.
  In case the last argument parsed by the context was a call-by-name (ended with '-{paramName}'),
  the context will try to resolve that parameter's value by calling the parameter's {@link CliParam#noValue()}.
  In case not all parameters were bound to values, the context will try to resolve those unbound parameters by
  calling their {@link CliParam#unbound()}.
  
  @return A {@link CommandArgs} if the context managed to construct one according to the above rules.
  @throws ParseException If an error occurred, according to the above rules.