Probably the best Objective-C method swizzling API