def METHOD_NAME(self, *args, **kwargs):
    if not self.keep_history:
        setattr(self, meth_name, no_op)
    else:
        # NOTE: This creates a reference cycle
        bound = partial(meth, self)
        update_wrapper(bound, meth)
        if not hasattr(bound, '__wrapped__'):
            bound.__wrapped__ = meth
        setattr(self, meth_name, bound)
    return getattr(self, meth_name)(*args, **kwargs)