docs: def run(self):
          ''' xfer & run module on all matched hosts '''
  
          # find hosts that match the pattern
          hosts = self.inventory.list_hosts(self.pattern)
          if len(hosts) == 0:
              self.callbacks.on_no_hosts()
              return dict(contacted={}, dark={})
  
          global multiprocessing_runner
          multiprocessing_runner = self
          results = None
  
          # Check if this is an action plugin. Some of them are designed
          # to be ran once per group of hosts. Example module: pause,
          # run once per hostgroup, rather than pausing once per each
          # host.
          p = utils.plugins.action_loader.get(self.module_name, self)
          if p and getattr(p, 'BYPASS_HOST_LOOP', None):
              # Expose the current hostgroup to the bypassing plugins
              self.host_set = hosts
              # We aren't iterating over all the hosts in this
              # group. So, just pick the first host in our group to
              # construct the conn object with.
              result_data = self._executor(hosts[0]).result
              # Create a ResultData item for each host in this group
              # using the returned result. If we didn't do this we would
              # get false reports of dark hosts.
              results = [ ReturnData(host=h, result=result_data, comm_ok=True) \
                             for h in hosts ]
              del self.host_set
          elif self.forks > 1:
              try:
                  results = self._parallel_exec(hosts)
              except IOError, ie:
                  print ie.errno
                  if ie.errno == 32:
                      # broken pipe from Ctrl+C
                      raise errors.AnsibleError("interupted")
                  raise
          else:
              results = [ self._executor(h) for h in hosts ]
          return self._partition_results(results)