code: public <T> void execute(final SpiceRequest<T> request, final Object requestCacheKey, final long cacheExpiryDuration, final RequestListener<T> requestListener) {
          final CachedSpiceRequest<T> cachedSpiceRequest = new CachedSpiceRequest<T>(request, requestCacheKey, cacheExpiryDuration);
          execute(cachedSpiceRequest, requestListener);
      }
docs: Execute a request. Before invoking the method
  {@link SpiceRequest#loadDataFromNetwork()}, the cache will be checked :
  if a result has been cached with the cache key <i>requestCacheKey</i>,
  RoboSpice will consider the parameter <i>cacheExpiryDuration</i> to
  determine whether the result in the cache is expired or not. If it is not
  expired, then listeners will receive the data in cache. Otherwise, the
  method {@link SpiceRequest#loadDataFromNetwork()} will be invoked and the
  result will be stored in cache using the cache key
  <i>requestCacheKey</i>.
  @param request
  the request to execute
  @param requestCacheKey
  the key used to store and retrieve the result of the request
  in the cache
  @param cacheExpiryDuration
  duration in milliseconds after which the content of the cache
  will be considered to be expired.
  {@link DurationInMillis#ALWAYS_RETURNED} means data in cache
  is always returned if it exists.
  {@link DurationInMillis#ALWAYS_EXPIRED} means data in cache is
  never returned.(see {@link DurationInMillis})
  @param requestListener
  the listener to notify when the request will finish