# Path: pynads/utils/compat.py
# def wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES):
#     """Decorator form of update_wrapper.
# 
#     This is very useful for writing closure based decorators rather than
#     using update_wrapper manually on the closure.
# 
#     Like update_wrapper, this decorator modifies what it's applied it.
#     """
#     return partial(update_wrapper,
#                    wrapped=wrapped,
#                    assigned=assigned,
#                    updated=updated)


from functools import partial
from .compat import wraps

    This decorator can be used on classes as well:

    .. code-block:: Python
        @kwarg_decorator
        class pre_post_print(object):
            def __init__(self, f, pre='', post=''):
                self.f = f
                self.pre = pre
                self.post = post

            def __call__(self, *a, **k):
                print(self.pre)
                r = self.f(*a, **k)
                print(self.post)
                return r

        @pre_post_print(pre='hello', post='goodbye')
        def greet(name):
            print(name)

    Calling greet results in:

        .. code-block:: Python
            hello
            alec
            goodbye

    However, to use it as a class decorator requires Python 2,6+.
    """

# Path: pynads/utils/compat.py
# def wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES):
#     """Decorator form of update_wrapper.
# 
#     This is very useful for writing closure based decorators rather than
#     using update_wrapper manually on the closure.
# 
#     Like update_wrapper, this decorator modifies what it's applied it.
#     """
#     return partial(update_wrapper,
#                    wrapped=wrapped,
#                    assigned=assigned,
#                    updated=updated)


# Path: pynads/utils/decorators.py
from functools import partial
from .compat import wraps


    This decorator can be used on classes as well:

    .. code-block:: Python
        @kwarg_decorator
        class pre_post_print(object):
            def __init__(self, f, pre='', post=''):
                self.f = f
                self.pre = pre
                self.post = post

            def __call__(self, *a, **k):
                print(self.pre)
                r = self.f(*a, **k)
                print(self.post)
                return r

        @pre_post_print(pre='hello', post='goodbye')
        def greet(name):
            print(name)

    Calling greet results in:

        .. code-block:: Python
            hello
            alec
            goodbye

    However, to use it as a class decorator requires Python 2,6+.
    """

    @wraps(deco)