'Display a menu.
.. todo:: This doesn\'t enable the help label/button (I wasn\'t sold on
any interface I came up with for this). It would be a nice feature
:param str message: title of menu
:param choices: Menu lines, len must be > 0
:type choices: list of tuples (tag, item) or
list of descriptions (tags will be enumerated)
:param default: default value to return (if one exists)
:param str cli_flag: option used to set this value with the CLI
:param bool force_interactive: True if it\'s safe to prompt the user
because it won\'t cause any workflow regressions
:returns: tuple of (`code`, `index`) where
`code` - str display exit code
`index` - int index of the user\'s selection
:rtype: tuple'

def menu(self, message, choices, ok_label=None, cancel_label=None, help_label=None, default=None, cli_flag=None, force_interactive=False, **unused_kwargs):

    if self._return_default(message, default, cli_flag, force_interactive):
        return (OK, default)
    self._print_menu(message, choices)
    (code, selection) = self._get_valid_int_ans(len(choices))
    return (code, (selection - 1))
