code: public InputStream get(String resource, CacheMissHandler ... handlers) throws CacheException {
  		InputStream stream = null;
  		if(Strings.isValid(resource)) {
  			stream = storage.retrieve(resource);		
  			if(stream == null) {
  				logger.trace("cache miss for resource '{}'...", resource);
  				if(handlers != null) {				
  					lookup:
  					for(CacheMissHandler handler : handlers) {
  						logger.trace("... attempting retrieval of '{}' using handler of class '{}'", resource, handler.getClass().getSimpleName());
  						try (InputStream input = handler.getAsStream(); OutputStream output = storage.store(resource)) {
  							if(input != null) {
  								long copied = Streams.copy(input,  output);
  								logger.trace("... stored {} bytes for resource '{}'", copied, resource);
  								break lookup;
  							} else {
  								logger.trace("... resource '{}' not found", resource);
  								continue lookup;
  							}
  						} catch (IOException e) {
  							logger.warn("I/O error trying to retrieve resource '" + resource + "' with handler of class '" + handler.getClass().getSimpleName() +"'", e);
  						}					
  					}
  				}
  				logger.trace("retrieving resource from storage");
  				stream = storage.retrieve(resource);			
  			}
  		}
  		return stream;
  	}
docs: Retrieves a resource from the cache if it is in there; if
  the <code>autoRefresh</code> flag is on, the cache will check
  if the resource has not been refreshed during this session yet
  and (if so) will retrieve it again.
  
  @param resource
  the name of the resource; it must be a valid, non empty string.
  @param handlers
  an optional set of cache miss handler, which will be requested to
  retrieve the resource, if missing; the handlers will be called in the
  order specified here, and as soon as one returns a valid stream the
  lookup stops.
  @return
  the resource as an input stream if it can be retrieved, {@code null}
  otherwise.
  @throws CacheException