docs: def timeout(cls, func):
          """
          This decorator sets a maximum timeout for a coroutine to execute. The timeout can be both
          set in the ``self.timeout`` attribute or in the ``timeout`` kwarg of the function call.
          I.e if you have a function ``get(self, key)``, if its decorated with this decorator, you
          will be able to call it with ``await get(self, "my_key", timeout=4)``.
  
          Use 0 or None to disable the timeout.
          """
          NOT_SET = "NOT_SET"
  
          @functools.wraps(func)
          async def _timeout(self, *args, timeout=NOT_SET, **kwargs):
              timeout = self.timeout if timeout == NOT_SET else timeout
              if timeout == 0 or timeout is None:
                  return await func(self, *args, **kwargs)
              return await asyncio.wait_for(func(self, *args, **kwargs), timeout)
  
          return _timeout