code: public T get(V value) {
  		T found = find(value);
  		if (found != null) {
  			return found;
  		}
  
  		synchronized (runtimeDefined) {
  			for (T obj : runtimeDefined) {
  				if (matches(obj, value)) {
  					return obj;
  				}
  			}
  
  			T created = create(value);
  			runtimeDefined.add(created);
  			return created;
  		}
  	}
docs: Searches for a case object by value, creating a new object if one cannot
  be found.
  @param value the value
  @return the object