def get_required_config(self):
        """because of the exsistance of subparsers, the configman options
        that correspond with argparse arguments are not a constant.  We need
        to produce a copy of the namespace rather than the actual embedded
        namespace."""
        required_config = Namespace()
        # add current options to a copy of required config
        for k, v in iteritems_breadth_first(self.required_config):
            required_config[k] = v
        # get any option found in any subparsers
        try:
            subparser_namespaces = (
                self.configman_subparsers_option.foreign_data
                .argparse.subprocessor_from_string_converter
            )
            subparsers = (
                self._argparse_subparsers._configman_option.foreign_data
                .argparse.subparsers
            )
            # each subparser needs to have its configman options set up
            # in the subparser's configman option.  This routine copies
            # the required_config of each subparser into the
            # SubparserFromStringConverter defined above.
            for subparser_name, subparser_data in six.iteritems(subparsers):
                subparser_namespaces.add_namespace(
                    subparser_name,
                    subparser_data.subparser.get_required_config()
                )
        except AttributeError:
            # there is no subparser
            pass
        return required_config
because of the exsistance of subparsers, the configman options
        that correspond with argparse arguments are not a constant.  We need
        to produce a copy of the namespace rather than the actual embedded
        namespace.