Ensure we wrap the decorated functions

To avoid losing the original functions docs, name
and other attributes ensure that this correctly uses
six.wraps (which uses functools.wraps internally) to
wrap the decorated function.