module EventMachine::Deferrable

def timeout seconds, *args

will cause the timer to be cancelled.
Setting the status at any time prior to a call to the expiration of the timeout
the Timeout expires (passing no arguments to the object's errbacks).
Setting a timeout on a Deferrable causes it to go into the failed state after
def timeout seconds, *args
  cancel_timeout
  me = self
  @deferred_timeout = EventMachine::Timer.new(seconds) {me.fail(*args)}
  self
end