==================
Deferred Execution
==================

  >>> from cybertools.util.defer import Deferred

To show what deferreds are about we need two classes.

The first one will be doing some time-consuming work, or may be it waits
for some event - as in this case simulated by calling the `nowItsTime()`
method. As the function or object that calls the `work()` method
- let's call it the client should not have to wait, this method immediately
returns a Deferred object.

Later on, when the work is finished, the Deferred's `callback()`
method will be called, thus notifying the client.

  >>> class Worker(object):
  ...
  ...     def work(self):
  ...         self.deferred = Deferred()
  ...         print('Worker: work started')
  ...         return self.deferred
  ...
  ...     def nowItsTime(self):
  ...         self.deferred.callback('Work completed')

The second class, the client, gives the worker object some work;
in order to get notified when the work is finished it registers a
callback method with the deferred object coming back from the
`work()` call.

  >>> class Client(object):
  ...
  ...     def run(self, worker):
  ...         deferred = worker.work()
  ...         deferred.addCallback(self.showResult)
  ...         print('Client: The worker seems to be working now...')
  ...
  ...     def showResult(self, result):
  ...         print('Result:', result)

So we now create a worker and a client, and let the client run:

  >>> w = Worker()
  >>> client = Client()
  >>> client.run(w)
  Worker: work started
  Client: The worker seems to be working now...

Working, working,...

Work will be completed when its time:

  >>> w.nowItsTime()
  Result: Work completed

