docs: public void process(Queue<String> argq, T state) {
      while (!argq.isEmpty()) {
        String nextArg = argq.peek();
        if (nextArg.startsWith("--")) {
          argq.remove();
          String key = nextArg.substring(2);
          Command<? super T> option = options.get(key);
          if (option != null) {
            option.process(argq, state);
          }
        } else if (nextArg.startsWith("-")) {
          argq.remove();
          for (int i = 1; i < nextArg.length(); i++) {
            char key = nextArg.charAt(i);
            Command<? super T> option = options.get(shortcuts.get(key));
            if (option != null) {
              option.process(argq, state);
            }
          }
        } else {
          Command<? super T> command = commands.get(nextArg);
          if (command != null) {
            argq.remove();
            command.process(argq, state);
            if (enterShell && shellCommand != null) {
              shellCommand.process(argq, state);
            }
            return;
          }
          break;
        }
      }
      if (defaultCommand != null) {
        defaultCommand.process(argq, state);
      }
      if (shellCommand != null) {
        shellCommand.process(argq, state);
      }
    }