(function() { var Ap = Array.prototype; var slice = Ap.slice; var Fp = Function.prototype; if (!Fp.bind) { // PhantomJS doesn't support Function.prototype.bind natively, so // polyfill it whenever this module is required. Fp.bind = function(context) { var func = this; var args = slice.call(arguments, 1); function bound() { var invokedAsConstructor = func.prototype && (this instanceof func); return func.apply( // Ignore the context parameter when invoking the bound function // as a constructor. Note that this includes not only constructor // invocations using the new keyword but also calls to base class // constructors such as BaseClass.call(this, ...) or super(...). !invokedAsConstructor && context || this, args.concat(slice.call(arguments)) ); } // The bound function must share the .prototype of the unbound // function so that any object created by one constructor will count // as an instance of both constructors. bound.prototype = func.prototype; return bound; }; } })();