 ///   - context1: Any context object to weakify and strongify.
 ///   - context2: Any context object to weakify and strongify.
 ///   - closure: Closure to execute instead of the original one.
+public func strongify<Context1: AnyObject, Context2: AnyObject>(weak context1: Context1?, _ context2: Context2?, closure: @escaping(Context1, Context2) -> Void) -> () -> Void {
+    return { [weak context1, weak context2] in
+        guard let strongContext1 = context1, let strongContext2 = context2 else { return }
+        closure(strongContext1, strongContext2)
+    }
+}
+
+/// Creates a closure that automatically deals with weak-strong dance
+///
+/// - Parameters:
+///   - context1: Any context object to weakify and strongify.
+///   - context2: Any context object to weakify and strongify.
+///   - closure: Closure to execute instead of the original one.
 public func strongify<Context1: AnyObject, Context2: AnyObject, Argument1>(weak context1: Context1?, _ context2: Context2?, closure: @escaping(Context1, Context2, Argument1) -> Void) -> (Argument1) -> Void {
     return { [weak context1, weak context2] argument1 in
         guard let strongContext1 = context1, let strongContext2 = context2 else { return }

///   - context7: Any context object to weakify and strongify.
///   - context8: Any context object to weakify and strongify.
///   - closure: Closure to execute instead of the original one.
public func strongify<Context1: AnyObject, Context2: AnyObject, Context3: AnyObject, Context4: AnyObject, Context5: AnyObject, Context6: AnyObject, Context7: AnyObject, Context8: AnyObject, Argument1>(weak context1: Context1?, _ context2: Context2?, _ context3: Context3?, _ context4: Context4?, _ context5: Context5?, _ context6: Context6?, _ context7: Context7?, _ context8: Context8?, closure: @escaping(Context1, Context2, Context3, Context4, Context5, Context6, Context7, Context8, Argument1) -> Void) -> (Argument1) -> Void {
    return { [weak context1, weak context2, weak context3, weak context4, weak context5, weak context6, weak context7, weak context8] argument1 in
        guard let strongContext1 = context1, let strongContext2 = context2, let strongContext3 = context3, let strongContext4 = context4, let strongContext5 = context5, let strongContext6 = context6, let strongContext7 = context7, let strongContext8 = context8 else { return }

/// - Parameters:
///   - context1: Any context object to weakify and strongify.
///   - closure: Closure to execute instead of the original one.
public func strongify<Context1: AnyObject>(weak context1: Context1?, closure: @escaping(Context1) -> Void) -> () -> Void {
    return { [weak context1] in
        guard let strongContext1 = context1 else { return }
        closure(strongContext1)
    }
}

/// Creates a closure that automatically deals with weak-strong dance
///
/// - Parameters:
///   - context1: Any context object to weakify and strongify.
///   - closure: Closure to execute instead of the original one.
public func strongify<Context1: AnyObject, Argument1>(weak context1: Context1?, closure: @escaping(Context1, Argument1) -> Void) -> (Argument1) -> Void {
    return { [weak context1] argument1 in
        guard let strongContext1 = context1 else { return }
