override this in a child class with your own logic, it must return a
        function that calls self.func

        :param func: callback -- the function being decorated
        :param decorator_args: tuple -- the arguments passed into the decorator (eg, @dec(1, 2))
        :param decorator_kwargs: dict -- the named args passed into the decorator (eg, @dec(foo=1))

def decorate(self, func, *decorator_args, **decorator_kwargs):
        """
        override this in a child class with your own logic, it must return a
        function that calls self.func

        :param func: callback -- the function being decorated
        :param decorator_args: tuple -- the arguments passed into the decorator (eg, @dec(1, 2))
        :param decorator_kwargs: dict -- the named args passed into the decorator (eg, @dec(foo=1))
        """
        def wrapper(*args, **kwargs):
            return func(*args, **kwargs)
        return wrapper