code: def _walk_config(config, modules, f, prefix=''):
      
      def work_in(parent_config, config_name, prefix, module):
          # create_config_tree() needs to have been called by now
          # and you should never hit either of these asserts
          if config_name not in parent_config:
              raise ProgrammerError('{0} not present in configuration'
                                    .format(prefix))
          if not isinstance(parent_config[config_name], collections.Mapping):
              raise ConfigurationError(
                  '{0} must be an object configuration'.format(prefix))
  
          # do the work!
          f(parent_config[config_name], module, prefix)
  
      return _recurse_config(config, modules, work_in)
docs: Recursively walk through a module list.
  
      For every module, calls ``f(config, module, name)`` where
      `config` is the configuration scoped to that module, `module`
      is the Configurable-like object, and `name` is the complete
      path (ending in the module name).
  
      :param dict config: configuration to walk and possibly update
      :param modules: modules or Configurable instances to use
      :type modules: iterable of :class:`~yakonfig.configurable.Configurable`
      :param f: callback function for each module
      :param str prefix: prefix name of the config
      :return: config