use functools update wrapper