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

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