def _load(self, path='config', filetype=None, relaxed=False, ignore=False):
        """ load key value pairs from a file

            Parameters:
                path     - path to configuration data (see Note 1)
                filetype - type component of dot-delimited path
                relaxed  - if True, define keys on the fly (see Note 2)
                ignore   - if True, ignore undefined keys in path

            Return:
                self

            Notes:

                1. The path can be:
                    * an open file object with a readlines method
                    * a dot delimited path to a file (see normalize_path)
                    * an os-specific path to a file (relative to cwd)
                    * an iterable of key=value strings

                2. Normally keys read from the file must conform to keys
                   previously defined for the Config. If the relaxed flag
                   is True, any keys found in the file will be accepted.
                   If the ignore flag is True, and kyes found in the file
                   that are not previously defined are ignored.
        """
        for num, line in enumerate(
                    un_comment(load_lines_from_path(path, filetype)),
                    start=1,
                ):
            if not line:
                continue
            try:
                key, val = line.split('=', 1)
                key = key.strip()
                val = val.strip()
                if relaxed:
                    self._define(key)
                try:
                    level, itemname = self.__lookup(key)
                except KeyError:
                    if ignore:
                        continue
                    raise
                item = level.get(itemname)
                if item is None:
                    raise KeyError(itemname)
                item.load(val)
            except Exception as e:
                args = e.args or ('',)
                msg = 'line {} of config: {}'. format(num, args[0])
                e.args = (msg,) + args[1:]
                raise
        return self
load key value pairs from a file

            Parameters:
                path     - path to configuration data (see Note 1)
                filetype - type component of dot-delimited path
                relaxed  - if True, define keys on the fly (see Note 2)
                ignore   - if True, ignore undefined keys in path

            Return:
                self

            Notes:

                1. The path can be:
                    * an open file object with a readlines method
                    * a dot delimited path to a file (see normalize_path)
                    * an os-specific path to a file (relative to cwd)
                    * an iterable of key=value strings

                2. Normally keys read from the file must conform to keys
                   previously defined for the Config. If the relaxed flag
                   is True, any keys found in the file will be accepted.
                   If the ignore flag is True, and kyes found in the file
                   that are not previously defined are ignored.