docs: def read(self, config_dir=None, config_name=None, clear=False):
          """
          read config from config_dir
          if config_dir is None, clear to default config
          clear will clear to default before reading new file
          """
  
  # TODO should probably allow config_dir to be a list as well
          # get name of config directory
          if not config_dir:
              config_dir = self._defaults.get('config_dir', None)
          if not config_dir:
              raise KeyError('config_dir not set')
  
          # get name of config file
          if not config_name:
              config_name = self._defaults.get('config_name', None)
          if not config_name:
              raise KeyError('config_name not set')
  
          conf_path = os.path.expanduser(config_dir)
          if not os.path.exists(conf_path):
              raise IOError("config dir not found at %s" % (conf_path,))
  
          config = munge.load_datafile(config_name, conf_path, default=None)
  
          if not config:
              raise IOError("config file not found in %s" % (conf_path,))
  
          if clear:
              self.clear()
  
          munge.util.recursive_update(self.data, config)
          self._meta_config_dir = conf_path
          return self