code: public T waitForResult(String key) throws RuntimeException,
  			ValidationException {
  
  		// Pull out the Future associated with the key.
  		Future<T> future = retrieve(key, true);
  
  		// Now wait for the result and process any exceptions.
  		T result = null;
  		try {
  			result = future.get();
  		} catch (InterruptedException ie) {
  			throw EvaluationException.create(MSG_INTERRUPTED_THREAD, key);
  		} catch (CancellationException ce) {
  			throw EvaluationException.create(MSG_CANCELLED_THREAD, key);
  		} catch (ExecutionException ee) {
  			throw ExceptionUtils.launder(ee);
  		}
  
  		return result;
  	}
docs: A convenience method that will retrieve (or create) the task associated
  with the key, wait for a result to be ready, and process any thrown
  exceptions.
  
  @param key
  Key for the associated task, usually an object or template
  name
  @return T the result associated with the given key
  
  @throws RuntimeException if there are any exceptions during evaluation
  
  @throws ValidationException if there are any exceptions during validation