http://www.wmdeveloper.com/2013/07/method-swizzling-explained.html