public <X extends T> T getValue( Getter<X> populator )
		throws ResourceNotFound
	{
		T value = getValueIfImmediatelyAvailable();
		if( value != null ) return value;
		
		while( !lockForPopulation() ) {
			synchronized( this ) {
				while(beingPopulated) try {
					wait();
				} catch( InterruptedException e ) {
					Thread.currentThread().interrupt();
				}
				value = (ref == null ? null : ref.get());
				// Value may have been lost already
				if( value != null || error != null ) return value;
			}
		}
		try {
			setValue(value = populator.get(uri));
		} catch( Exception e ) {
			setError(e);
			rethrow(e);
		}
		
		return value;
	}