*
@method bind(<scope>, [arg1], ...)
@returns Function
@short Binds <scope> as the %this% object for the function when it is called. Also allows currying an unlimited number of parameters.
@extra "currying" means setting parameters ([arg1], [arg2], etc.) ahead of time so that they are passed when the function is called later. If you pass additional parameters when the function is actually called, they will be added will be added to the end of the curried parameters. This method is provided for browsers that don't support it internally.
@example

+   (function() {
return this;
}).bind('woof')(); -> returns 'woof'; function is bound with 'woof' as the this object.
(function(a) {
return a;
}).bind(1, 2)();   -> returns 2; function is bound with 1 as the this object and 2 curried as the first parameter
(function(a, b) {
return a + b;
}).bind(1, 2)(3);  -> returns 5; function is bound with 1 as the this object, 2 curied as the first parameter and 3 passed as the second when calling the function

*
function(scope) {
      var fn = this, args = multiArgs(arguments).slice(1), nop, bound;
      if(!isFunction(this)) {
        throw new TypeError('Function.prototype.bind called on a non-function');
      }
      bound = function() {
        return fn.apply(fn.prototype && this instanceof fn ? this : scope, args.concat(multiArgs(arguments)));
      }
      bound.prototype = this.prototype;
      return bound;
    }