code: def _wrapped_method_with_watch_fn(self, f, *args, **kwargs):
          
          bound_args = signature(f).bind(*args, **kwargs)
          orig_watch = bound_args.arguments.get("watch")
  
          if orig_watch is not None:
              wrapped_watch = partial(self._call_in_reactor_thread, orig_watch)
              wrapped_watch = wraps(orig_watch)(wrapped_watch)
              bound_args.arguments["watch"] = wrapped_watch
  
          return f(**bound_args.arguments)
docs: A wrapped method with a watch function.
  
          When this method is called, it will call the underlying method with
          the same arguments, *except* that if the ``watch`` argument isn't
          :data:`None`, it will be replaced with a wrapper around that watch
          function, so that the watch function will be called in the reactor
          thread. This means that the watch function can safely use Twisted
          APIs.