def METHOD_NAME(wrapped_fn):
    @wraps(wrapped_fn)
    def wrapped(self, *args, **kwargs):
        # Use a weak reference to self; this prevents a self-reference
        # cycle that fools the garbage collector into thinking the instance
        # shouldn't be dropped when all external references are dropped.
        weak_ref_to_self = weakref.ref(self)
        @wraps(wrapped_fn)
        @lru_cache(*lru_args, **lru_kwargs)
        def cached(*args, **kwargs):
            return wrapped_fn(weak_ref_to_self(), *args, **kwargs)
        setattr(self, wrapped_fn.__name__, cached)
        return cached(*args, **kwargs)
    return wrapped