sclass DeferredComputation { new Flag done; O value; Throwable error; Runnable continuation, onError; void setContinuation(Runnable r) { synchronized(done) { if (!done.isUp()) ret with continuation = r; } if (error == null) callF(r); else if (onError != null) callF(onError); else printStackTrace(error); } void setValue(O value) { synchronized(done) { if (done.isUp()) fail("setValue/setError called twice"); this.value = value; done.raise(); } callF(continuation); } void setError(Throwable error) { synchronized(done) { if (done.isUp()) fail("setValue/setError called twice"); this.error = error; done.raise(); } if (onError != null) callF(onError); else printStackTrace(error); } O getValue() { assertTrue(done.isUp()); ret value; } }