def METHOD_NAME(func):
    @functools.wraps(func)
    def wrapped_func(self, *args, **kwargs):
        # We're storing the wrapped method inside the instance. If we had
        # a strong reference to self the instance would never die.
        self_weak = weakref.ref(self)
        @functools.wraps(func)
        @functools.lru_cache(*lru_args, **lru_kwargs)
        def cached_method(*args, **kwargs):
            return func(self_weak(), *args, **kwargs)
        setattr(self, func.__name__, cached_method)
        return cached_method(*args, **kwargs)
    return wrapped_func