memoize opts.callback