ersion=1127):
                type = e['type']
                object = e['object']  # object is one of type return_type
                raw_object = e['raw_object']  # raw_object is a dict
                ...
                if should_stop:
                    watch.stop()
        """

    self._stop = False
    return_type = self.get_return_type(func)
    kwargs[self.get_watch_argument_name(func)] = True
    kwargs['_preload_content'] = False
    if 'resource_version' in kwargs:
      self.resource_version = kwargs['resource_version']

    timeouts = ('timeout_seconds' in kwargs)
    while True:
      resp = func(*args, **kwargs)
      try:
        for line in iter_resp_lines(resp):
          yield self.unmarshal_event(line, return_type)
          if self._stop:
            break
      finally:
        resp.close()
        resp.release_conn()
        if self.resource_version is not None:
          kwargs['resource_version'] = self.resource_version
        else:
          self._stop = True

      if timeouts or self._stop:
        break
