/** * @private */Ext.define('Ext.mixin.Hookable', { extend: 'Ext.Mixin', mixinConfig: { id: 'hookable' }, bindHook: function(instance, boundMethod, bindingMethod, preventDefault, extraArgs) { if (!bindingMethod) { bindingMethod = boundMethod; } var boundFn = instance[boundMethod], fn, binding; if (boundFn && boundFn.hasOwnProperty('$binding')) { binding = boundFn.$binding; if (binding.bindingMethod === bindingMethod && binding.bindingScope === this) { return this; } } instance[boundMethod] = fn = function() { var binding = fn.$binding, scope = binding.bindingScope, args = Array.prototype.slice.call(arguments); args.push(arguments); if (extraArgs) { args.push.apply(args, extraArgs); } if (!binding.preventDefault && scope[binding.bindingMethod].apply(scope, args) !== false) { return binding.boundFn.apply(this, arguments); } }; fn.$binding = { preventDefault: !!preventDefault, boundFn: boundFn, bindingMethod: bindingMethod, bindingScope: this }; return this; }, unbindHook: function(instance, boundMethod, bindingMethod) { if (!bindingMethod) { bindingMethod = boundMethod; } var fn = instance[boundMethod], binding = fn.$binding, boundFn, currentBinding; while (binding) { boundFn = binding.boundFn; if (binding.bindingMethod === bindingMethod && binding.bindingScope === this) { if (currentBinding) { currentBinding.boundFn = boundFn; } else { instance[boundMethod] = boundFn; } return this; } currentBinding = binding; binding = boundFn.$binding; } return this; }});