docs: def fire(self, *args, **kargs):
          """ collects results of all executed handlers """
  
          self._time_secs_old = time.time()
          # allow register/unregister while execution
          # (a shallowcopy should be okay.. https://docs.python.org/2/library/copy.html )
          with self._hlock:
              handler_list = copy.copy(self._handler_list)
          result_list = []
          for handler in handler_list:
              if self._sync_mode:
                  # grab results of all handlers
                  result = self._execute(handler, *args, **kargs)
                  if isinstance(result, tuple) and len(result) == 3 and isinstance(result[1], Exception):
                      # error occurred
                      one_res_tuple = (False, self._error(result), handler)
                  else:
                      one_res_tuple = (True, result, handler)
              else:
                  # execute handlers in background, ignoring result
                  EventSystem._async_queue.put((handler, args, kargs))
                  one_res_tuple = (None, None, handler)
              result_list.append(one_res_tuple)
  
          # update statistics
          time_secs_new = time.time()
          self.duration_secs = time_secs_new - self._time_secs_old
          self._time_secs_old = time_secs_new
  
          return result_list