Use functools for back compat