def decorator_with_args(decorator_to_enhance):
    """Decorate a decorator that takes arguments to change how it's called
    it allows to change how it's defined. Instead of this defintion :
    def decorator(*outer_args, **outer_kwargs):
        def __inner_decorate(func):
            def __inner_func(*args, **kwargs):
                kwargs.update(outer_kwargs)
                return do_whatever(args + outer_args, **kwargs)
            return __inner_func
        return __inner_decorate
    You can use this form :
    def decorator(func, *outer_args, **outer_kwargs):
        def __inner_func(*args, **kwargs):
            kwargs.update(outer_args)
            return do_whatever(args + outer_args, kwargs)
        return __inner_func
    """
    def decorator_maker(*args, **kwargs):
        def decorator_wrapper(func):
            return decorator_to_enhance(func, *args, **kwargs)
        return decorator_wrapper
    return decorator_maker