 
     NSBatchUpdateRequest and NSAsynchronousFetchRequest require a context with a persistent store connected directly,
     if this was not the case this context would be marked private.
-
-    - returns: NSManagedObjectContext The primary persisting background context.
     */
     public let privateQueueContext: NSManagedObjectContext = {
         let managedObjectContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)

        case .SQLite(let storeURL):
            let coordinator = persistentStoreCoordinator
            let mom = managedObjectModel
            dispatch_group_notify(saveBubbleDispatchGroup, dispatch_get_main_queue()) {
                do {
                    if #available(iOS 9, *), let store = coordinator.persistentStoreForURL(storeURL) {
                        try coordinator.removePersistentStore(store)
                    } else {
                        try NSFileManager.defaultManager().removeItemAtURL(storeURL)
                    }

                    NSPersistentStoreCoordinator.setupSQLiteBackedCoordinator(mom, storeFileURL: storeURL) { result in
                        switch result {
                        case .Success (let coordinator):
                            self.persistentStoreCoordinator = coordinator
                            resetCallback(.Success)
                        case .Failure (let error):
                            resetCallback(.Failure(error))
                        }
                    }
                } catch let fileRemoveError {
                    resetCallback(.Failure(fileRemoveError))
                }
            }
        }

public typealias CoreDataStackSQLiteResetCallback = ResetResult -> Void
public typealias CoreDataStackBatchMOCCallback = BatchContextResult -> Void

// MARK: - Error Handling
public enum CoreDataStackError: ErrorType {
    case StoreNotFoundAtURL(url: NSURL)
}

/**
Three layer CoreData stack comprised of:

