Add a caching function macro