functools.wraps for decorator niceness