code: def get(self, **params):
          
          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
docs: 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.