 @available(macOS 10.5, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
 internal extension DarwinCentral {
     
-    @objc(GATTAsyncCentralManagerDelegate)
-    final class Delegate: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {
-        
-        private(set) weak var central: DarwinCentral!
-        
-        fileprivate init(_ central: DarwinCentral) {
-            super.init()
-            self.central = central
-        }
-        
-        private func log(_ function: String = #function, _ arguments: String?...) {
-            let message = arguments
-                .lazy
-                .compactMap { $0 }
-                .reduce(into: function) { $0 += " " + $1 }
-            self.central.log(message)
-        }
-        
-        // MARK: - CBCentralManagerDelegate
-        
-        func centralManagerDidUpdateState(_ centralManager: CBCentralManager) {
-            assert(self.central != nil)
-            assert(self.central?.centralManager === centralManager)
-            let state = unsafeBitCast(centralManager.state, to: DarwinBluetoothState.self)
-            log(state.description)
-            self.central.continuation.state.yield(state)
-        }
-        
+    @objc(GATTAsyncCentralManagerRestorableDelegate)
+    class RestorableDelegate: Delegate {
+        
+        @objc
         func centralManager(_ centralManager: CBCentralManager, willRestoreState state: [String : Any]) {
             assert(self.central != nil)
             assert(self.central?.centralManager === centralManager)

        self.options = options
        self.continuation = continuation
        self.queue = queue
        self.delegate = Delegate(self)
        self.centralManager = CBCentralManager(
            delegate: self.delegate,
            queue: self.queue,

import GATT

@available(macOS 10.5, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
public final class DarwinCentral: CentralManager {
    
    // MARK: - Properties
    
