Return a list of commands that where affected by a recent change
        (following a poll() return for the controlling file descriptor).

        Each list element is a tuple:

            (name, command_path, module_list)

        The event queue will be read multiple times and reads continue
        until a timeout occurs.

def get(self, **params):
        """
        Return a list of commands that where affected by a recent change
        (following a poll() return for the controlling file descriptor).

        Each list element is a tuple:

            (name, command_path, module_list)

        The event queue will be read multiple times and reads continue
        until a timeout occurs.
    """
        log = self._getparam('log', self._discard, **params)

        changes = {}
        paths = self._watch.get(**params)

        #  On each event, de-invert the tree to produce a
        #  list of changes by command name.
        #
        for path in paths:
            if path in self.modules:
                for name in self.modules[path]:
                    if name in changes:
                        if path not in changes[name]:
                            changes[name].append(path)
                    else:
                        changes[name] = [path]
            else:
                log.warning("Path %r had no matching watch entry", path)
        names = list(changes)
        log.debug("Change was to %d name%s", len(names), ses(len(names)))
        names.sort()
        resp = []
        for name in names:
            resp.append((name, self.names.get(name), changes[name]))
        return resp