'Add an iterator to the list of iterators this L{Cooperator} is
currently running.
Equivalent to L{cooperate}, but returns a L{defer.Deferred} that will
be fired when the task is done.
@param doneDeferred: If specified, this will be the Deferred used as
the completion deferred.  It is suggested that you use the default,
which creates a new Deferred for you.
@return: a Deferred that will fire when the iterator finishes.'

def coiterate(self, iterator, doneDeferred=None):

    if (doneDeferred is None):
        doneDeferred = defer.Deferred()
    CooperativeTask(iterator, self).whenDone().chainDeferred(doneDeferred)
    return doneDeferred
