Add generic memoization function