code: public synchronized T get(final File file, final ItemCreator<T> creator) {
          if (!file.exists()) {
              remove(file);
              return null;
          }
          final long lastmod = file.lastModified();
          final Long cachetime = expiry.get(file);
          final T entry;
          final T orig = cache.get(file);
          if (null == cachetime || expiration.isExpired(file, cachetime, orig)) {
              entry = creator.createCacheItemForFile(file);
              if (null == entry) {
                  remove(file);
                  return null;
              }
              if (null != orig && !entry.equals(orig)) {
                  remove(file);
                  cache.put(file, entry);
              } else if (null == orig) {
                  cache.put(file, entry);
              } else {
                  //noop, retain orig
              }
              expiry.put(file, lastmod);
          } else {
              entry = cache.get(file);
          }
          return entry;
      }
docs: Get entry for a file, and use the creator if necessary to create it. The creator will be called if the cache is
  out of date for the file. If the created item is equals to any existing cached item for the file then the old
  item will not be replaced.  Otherwise, if the old item is {@link Expireable} then the {@link Expireable#expire()}
  method will be called on it.
  
  @param file    the ifle
  @param creator the item creator
  
  @return the item associated with the file, or null if none is found