      - parameter errors: an array of `Error`s.
      */
     func operationQueue(_ queue: OperationQueue, didFinishOperation operation: Operation)
+}
+
+public extension OperationQueueDelegate {
+
+    func operationQueue(_ queue: OperationQueue, willAddOperation operation: Operation) { /* default no-op */ }
+
+    func operationQueue(_ queue: OperationQueue, willFinishOperation operation: Operation) { /* default no-op */ }
 }
 
 /**

        /// Add an observer to invoke the will finish delegate method
        procedure.addWillFinishBlockObserver { [weak self] procedure, errors in
            if let queue = self {
                self?.delegate?.procedureQueue(queue, willFinishOperation: procedure, withErrors: errors)
            }
        }


    func procedureQueue(_ queue: ProcedureQueue, willProduceOperation operation: Operation)
}

public extension ProcedureQueueDelegate {

    func procedureQueue(_ queue: ProcedureQueue, willAddOperation operation: Operation) { /* default no-op */ }

    func procedureQueue(_ queue: ProcedureQueue, willFinishOperation operation: Operation, withErrors errors: [Error]) { /* default no-op */ }

    func procedureQueue(_ queue: ProcedureQueue, willProduceOperation operation: Operation) { /* default no-op */ }
}

/**
 An `OperationQueue` subclass which supports the features of ProcedureKit. All functionality
 is achieved via the overridden functionality of `addOperation`.
