docs: public void addCommand(String name, Object object, String... aliases) {
          JCommander jc = new JCommander(options);
          jc.addObject(object);
          jc.createDescriptions();
          jc.setProgramName(name, aliases);
          ProgramName progName = jc.programName;
          commands.put(progName, jc);
  
      /*
      * Register aliases
      */
          //register command name as an alias of itself for reverse lookup
          //Note: Name clash check is intentionally omitted to resemble the
          //     original behaviour of clashing commands.
          //     Aliases are, however, are strictly checked for name clashes.
          aliasMap.put(new StringKey(name), progName);
          for (String a : aliases) {
              IKey alias = new StringKey(a);
              //omit pointless aliases to avoid name clash exception
              if (!alias.equals(name)) {
                  ProgramName mappedName = aliasMap.get(alias);
                  if (mappedName != null && !mappedName.equals(progName)) {
                      throw new ParameterException("Cannot set alias " + alias
                              + " for " + name
                              + " command because it has already been defined for "
                              + mappedName.name + " command");
                  }
                  aliasMap.put(alias, progName);
              }
          }
      }