docs: def cached(func):
      """Cache return values for multiple executions of func + args
  
      For example::
  
          @cached
          def unit_get(attribute):
              pass
  
          unit_get('test')
  
      will cache the result of unit_get + 'test' for future calls.
      """
      @wraps(func)
      def wrapper(*args, **kwargs):
          global cache
          key = json.dumps((func, args, kwargs), sort_keys=True, default=str)
          try:
              return cache[key]
          except KeyError:
              pass  # Drop out of the exception handler scope.
          res = func(*args, **kwargs)
          cache[key] = res
          return res
      wrapper._wrapped = func
      return wrapper