docs: @Override
      protected void doApply(final ApiRequest request, final IPolicyContext context, final CachingConfig config,
              final IPolicyChain<ApiRequest> chain) {
          if (config.getTtl() > 0) {
              // Check to see if there is a cache entry for this request.  If so, we need to
              // short-circuit the connector factory by providing a connector interceptor
              String cacheId = buildCacheID(request);
              context.setAttribute(CACHE_ID_ATTR, cacheId);
              ICacheStoreComponent cache = context.getComponent(ICacheStoreComponent.class);
              cache.getBinary(cacheId, ApiResponse.class,
                      new IAsyncResultHandler<ISignalReadStream<ApiResponse>>() {
                          @Override
                          public void handle(IAsyncResult<ISignalReadStream<ApiResponse>> result) {
                              if (result.isError()) {
                                  chain.throwError(result.getError());
                              } else {
                                  ISignalReadStream<ApiResponse> cacheEntry = result.getResult();
                                  if (cacheEntry != null) {
                                      context.setConnectorInterceptor(new CacheConnectorInterceptor(cacheEntry));
                                      context.setAttribute(SHOULD_CACHE_ATTR, Boolean.FALSE);
                                      context.setAttribute(CACHED_RESPONSE, cacheEntry.getHead());
                                  }
                                  chain.doApply(request);
                              }
                          }
                      });
          } else {
              context.setAttribute(SHOULD_CACHE_ATTR, Boolean.FALSE);
              chain.doApply(request);
          }
      }