             task.addObserver(retryObserver)
         }
         
+        _ = task
+            .conditions
+            .flatMap { $0.dependency(forTask: task) }
+            .map { task.addDependency($0); addOperation($0) }
+        
+        delegate?.didAdd(task: task, toQueue: self)
+        
         addOperation(task)
-        delegate?.didAdd(task: task, toQueue: self)
-        
-        task.willEnqueue()
+    }
+    
+    public override func addOperation(operation: NSOperation) {
+        super.addOperation(operation)
+        
+        if operation.respondsToSelector(#selector(Task<Any>.willEnqueue)) {
+            operation.performSelector(#selector(Task<Any>.willEnqueue))
+        }
     }
     
     /**

    public func addTasks<T>(tasks: [Task<T>]) {
        _ = tasks.map { addTask($0) }
    }
    
    /**
     Retries task execution. Method will decrease task retry count, set task
     state to `Initialized` and add it to the queue again.
     
     - Parameter task: Task to be retried
    */
    func retry<T>(task task: Task<T>) {
        do {
            try task.decreaseRetryCount()

 
 `TaskQueue` has a custom delegate which can be used to monitor certain events
 in `TaskQueue` lifecycle. See `TaskQueueDelegate` for more information
 
 */
public class TaskQueue: NSOperationQueue {
    
    /**
