def METHOD_NAME(func):
    def select_hooks(obj, kind):
        phase = kind + func.__name__
        if phase not in hooks:
            return []
        return [h for h in hooks.get(phase, [])
                if h.__name__ not in getattr(obj, '_disabled_hooks', [])]
    @functools.wraps(func)
    def _fn(obj, *args, **kwargs):
        for h in select_hooks(obj, 'pre_'):
            getattr(obj, h.__name__)()
        func(obj, *args, **kwargs)
        for h in select_hooks(obj, 'post_'):
            getattr(obj, h.__name__)()
    return _fn