 
   private func registerInvoker<T, U, V, W, X, R>(for selector: Selector, block: @escaping (T, U, V, W, X) -> R) {
     invokers[selector] = { extractor, setReturnValue in
-      let a1 = UnsafeMutablePointer<T>.allocate(capacity: 1)
-      extractor(2, a1)
-      let a2 = UnsafeMutablePointer<U>.allocate(capacity: 1)
-      extractor(3, a2)
-      let a3 = UnsafeMutablePointer<V>.allocate(capacity: 1)
-      extractor(4, a3)
-      let a4 = UnsafeMutablePointer<W>.allocate(capacity: 1)
-      extractor(5, a4)
-      let a5 = UnsafeMutablePointer<X>.allocate(capacity: 1)
-      extractor(6, a5)
-      var r = block(a1.pointee as T, a2.pointee as U, a3.pointee as V, a4.pointee as W, a5.pointee as X)
+      var r = block(arg(extractor, 2), arg(extractor, 3), arg(extractor, 4), arg(extractor, 5), arg(extractor, 6))
       if let setReturnValue = setReturnValue { setReturnValue(&r) }
     }
     registerDelegate()


  private func registerInvoker<T, R>(for selector: Selector, block: @escaping (T) -> R) {
    invokers[selector] = { extractor, setReturnValue in
      let a1 = UnsafeMutablePointer<T>.allocate(capacity: 1)
      extractor(2, a1)
      var r = block(a1.pointee as T)
      if let setReturnValue = setReturnValue { setReturnValue(&r) }
    }
    registerDelegate()


  private func registerInvoker<T, U, V, R>(for selector: Selector, block: @escaping (T, U, V) -> R) {
    invokers[selector] = { extractor, setReturnValue in
      var r = block(arg(extractor, 2), arg(extractor, 3), arg(extractor, 4))
      if let setReturnValue = setReturnValue { setReturnValue(&r) }
    }
    registerDelegate()
