         - force: If set to true, will save each model whether or not it returns true to `needsSync`. Use with care when doing this across the entire graph
      */
     public func sync(executor: Executor? = nil, force: Bool = false) throws {
+        try syncDelegate?.graphWillSync()
+
         var syncKeys = type(of: self).ModelSyncOrder
         for key in _store.keys { if !syncKeys.contains(key) { syncKeys.append(key) } }
         

                try store.sync(executor: executor, force: force)
            }
        }
    }
    
    // MARK: Private

import Vapor
import FluentProvider
import Foundation

/**
    Implements callbacks for the Graph sync lifecycle
 */
public protocol GraphSyncDelegate {
    func graphWillSync() throws
    func graphDidSync()
}

open class Graph : GraphSynchronizable {
    /**
