@Override
  public FeatureState getFeatureState(Feature feature) {

    // first try to find it from the cache
    CacheEntry entry = cache.get(feature);
    if (entry != null && !isExpired(entry)) {
      return entry.getState() != null ? entry.getState().copy() : null;
    }

    // no cache hit
    FeatureState featureState = delegate.getFeatureState(feature);

    // cache the result (may be null)
    cache.put(feature, new CacheEntry(featureState != null ? featureState.copy() : null));

    // return the result
    return featureState;
  }
 @Override
 public void setFeatureState(FeatureState featureState) {
   delegate.setFeatureState(featureState);
   cache.remove(featureState.getFeature());
 }