def METHOD_NAME(
    func: Callable[Concatenate[HasClock, P], Awaitable[R]]
) -> Callable[P, Awaitable[R]]:
    block_name = func.__name__ if name is None else name
    @wraps(func)
    async def measured_func(self: HasClock, *args: P.args, **kwargs: P.kwargs) -> R:
        with Measure(self.clock, block_name):
            r = await func(self, *args, **kwargs)
        return r
    # There are some shenanigans here, because we're decorating a method but
    # explicitly making use of the `self` parameter. The key thing here is that the
    # return type within the return type for `measure_func` itself describes how the
    # decorated function will be called.
    return measured_func  # type: ignore[return-value]