code: public T get(Object key) {
  		// output for requested key null is the value null; normal Map behavior
  		if(key == null) return null;
  		
  		T result = null;
  		if((result = cache.get(key)) != null) {
  			// if the requested key maps to a value in the cache
  			return result;
  		} else if((result = container.get(key)) != null) {
  			// if the requested key maps to a value in the container
  			return result;
  		} else {
  			// check if the requested key is a matching string of a regex key from our container
  			Iterator<Entry<String, T>> regexKeys = container.entrySet().iterator();
  			while(regexKeys.hasNext()) {
  				// prepare current entry
  				Entry<String, T> entry = regexKeys.next();
  				// check if the key is a regex matching the input key
  				if(Pattern.matches(entry.getKey(), (String) key)) {
  					putCache((String) key, entry.getValue());
  					return entry.getValue();
  				}
  			}
  		}
  		
  		// no value for the given key was found in any of container/cache/regexkey-container
  		return null;
  	}
docs: checks whether the requested key has a direct match in either cache or container, and if it
  doesn't, also evaluates the container's keyset as regexes to match against the input key and
  if any of those methods yield a value, returns that value
  if a value is found doing regex evaluation, use that regex-key's match as a non-regex
  key with the regex's value to form a new entry in the cache.