override this in a child class with your own logic, it must return a
        function that returns klass or the like

        :param klass: the class object that is 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 class

def decorate_class(self, klass, *decorator_args, **decorator_kwargs):
        """override this in a child class with your own logic, it must return a
        function that returns klass or the like

        :param klass: the class object that is 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 class
        """
        raise RuntimeError("decorator {} does not support class decoration".format(self.__class__.__name__))
        return klass