docs: def setup_parser(self, parser=None, subparsers=None):
          """
          Create the argument parser for this instance
  
          This method uses the functions defined in the :attr:`commands`
          attribute to create a command line utility via the
          :class:`FuncArgParser` class. Each command in the :attr:`commands`
          attribute is interpreted as on subparser and setup initially via the
          :meth:`FuncArgParser.setup_args` method. You can modify the parser
          for each command *cmd* by including a ``_modify_cmd`` method that
          accepts the subparser as an argument
  
          Parameters
          ----------
          parser: FuncArgParser
              The parser to use. If None, a new one will be created
          subparsers: argparse._SubParsersAction
              The subparsers to use. If None, the
              :attr:`~ArgumentParser.add_subparser` method from `parser` will be
              called
  
          Returns
          -------
          FuncArgParser
              The created command line parser or the given `parser`
          argparse._SubParsersAction
              The created subparsers action or the given `subparsers`
          dict
              A mapping from command name in the :attr:`commands` attribute to
              the corresponding command line parser
  
          See Also
          --------
          parse_args"""
          commands = self.commands[:]
          parser_cmds = self.parser_commands.copy()
  
          if subparsers is None:
              if parser is None:
                  parser = FuncArgParser(self.name)
              subparsers = parser.add_subparsers(chain=True)
  
          ret = {}
          for i, cmd in enumerate(commands[:]):
              func = getattr(self, cmd)
              parser_cmd = parser_cmds.setdefault(cmd, cmd.replace('_', '-'))
              ret[cmd] = sp = parser.setup_subparser(
                  func, name=parser_cmd, return_parser=True)
              sp.setup_args(func)
              modifier = getattr(self, '_modify_' + cmd, None)
              if modifier is not None:
                  modifier(sp)
          self.parser_commands = parser_cmds
          parser.setup_args(self.app_main)
          self._modify_app_main(parser)
          self.parser = parser
          self.subparsers = ret
          return parser, subparsers, ret