cacher can take a caching function now