add memoize functionality