docs: def decorate_func(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))
          :returns: the wrapped func with our decorator func
          """
          raise RuntimeError("decorator {} does not support function decoration".format(self.__class__.__name__))
          def wrapper(*args, **kwargs):
              return func(*args, **kwargs)
          return wrapper