def METHOD_NAME(self, *args, **kwargs):
    ctx_manager = self.__wrapped__.METHOD_NAME(*args, **kwargs)
    pin = Pin.get_from(self)
    if not pin:
        return ctx_manager
    # The result of `cursor()` is an `aiomysql.utils._ContextManager`
    #   which wraps a coroutine (a future) and adds async context manager
    #   helper functions to it.
    # https://github.com/aio-libs/aiomysql/blob/8a32f052a16dc3886af54b98f4d91d95862bfb8e/aiomysql/connection.py#L461
    # https://github.com/aio-libs/aiomysql/blob/7fa5078da31bbc95f5e32a934a4b2b4207c67ede/aiomysql/utils.py#L30-L79
    # We cannot swap out the result on the future/context manager so
    #   instead we have to create a new coroutine that returns our
    #   wrapped cursor
    # We also cannot turn `def cursor` into `async def cursor` because
    #   otherwise we will change the result to be a coroutine instead of
    #   an `aiomysql.utils._ContextManager` which wraps a coroutine. This
    #   will cause issues with `async with conn.cursor() as cur:` usage.
    async def _wrap_cursor():
        METHOD_NAME = await ctx_manager
        return self._self_cursor_cls(METHOD_NAME, pin)
    return type(ctx_manager)(_wrap_cursor())