docs: def cached(self, TTL=60 * 24):
          '''A decorator that will cache the output of the wrapped function. The
          key used for the cache is the function name as well as the `*args` and
          `**kwargs` passed to the function.
  
          :param TTL: time to live in minutes
  
          .. note:: For route caching, you should use
                    :meth:`xbmcswift2.Plugin.cached_route`.
          '''
          def decorating_function(function):
              # TODO test this method
              storage = self.get_storage(self._function_cache_name, file_format='pickle',
                                         TTL=TTL)
              kwd_mark = 'f35c2d973e1bbbc61ca60fc6d7ae4eb3'
  
              @wraps(function)
              def wrapper(*args, **kwargs):
                  key = (function.__name__, kwd_mark,) + args
                  if kwargs:
                      key += (kwd_mark,) + tuple(sorted(kwargs.items()))
  
                  try:
                      result = storage[key]
                      log.debug('Storage hit for function "%s" with args "%s" '
                                'and kwargs "%s"', function.__name__, args,
                                kwargs)
                  except KeyError:
                      log.debug('Storage miss for function "%s" with args "%s" '
                                'and kwargs "%s"', function.__name__, args,
                                kwargs)
                      result = function(*args, **kwargs)
                      storage[key] = result
                      storage.sync()
                  return result
              return wrapper
          return decorating_function