docs: def memoize(obj):
      """Decorator to create memoized functions, methods or classes."""
      cache = obj.cache = {}
  
      @functools.wraps(obj)
      def memoizer(*args, **kwargs):
          if args not in cache:
              cache[args] = obj(*args, **kwargs)
          return cache[args]
      return memoizer