index.js
function(context, callback) {
		if (arguments.length === 1) {
			callback = context;
			context = this._context;
		}
		if (this.isAsync) {
			// clone the arguments so this.call can be reused with different callbacks
			var asyncArgs = this._arguments.slice();
			// push the callback onto the new arguments array
			asyncArgs.push(callback);
			// call the function
			this.fn.apply(context, asyncArgs);
		} else {
			// if the function isn't async, allow it to be called with or without a callback
			if (callback) {
				// If a callback is provided, it must use the error-first arguments pattern.
				// The return value of the function will be the second argument.
				try {
					callback(null, this.fn.apply(context, this._arguments));
				} catch(e) {
					callback(e);
				}
			} else {
				// If no callback is provided simply return the result of the function
				return this.fn.apply(context, this._arguments);
			}
		}
	}
function(context, callback) {
		if (arguments.length === 1) {
			callback = context;
			context = this._context;
		}
		if (this.isAsync) {
			// clone the arguments so this.call can be reused with different callbacks
			var asyncArgs = this._arguments.slice();
			// push the callback onto the new arguments array
			asyncArgs.push(callback);
			// call the function
			this.fn.apply(context, asyncArgs);
		} else {
			// if the function isn't async, allow it to be called with or without a callback
			if (callback) {
				// If a callback is provided, it must use the error-first arguments pattern.
				// The return value of the function will be the second argument.
				try {
					callback(null, this.fn.apply(context, this._arguments));
				} catch(e) {
					callback(e);
				}
			} else {
				// If no callback is provided simply return the result of the function
				return this.fn.apply(context, this._arguments);
			}
		}
	}
function ( context , callback ) { if ( arguments . length === 1 ) { callback = context ; context = this . _context ; } if ( this . isAsync ) { // clone the arguments so this.call can be reused with different callbacks var asyncArgs = this . _arguments . slice ( ) ; // push the callback onto the new arguments array asyncArgs . push ( callback ) ; // call the function this . fn . apply ( context , asyncArgs ) ; } else { // if the function isn't async, allow it to be called with or without a callback if ( callback ) { // If a callback is provided, it must use the error-first arguments pattern. // The return value of the function will be the second argument. try { callback ( null , this . fn . apply ( context , this . _arguments ) ) ; } catch ( e ) { callback ( e ) ; } } else { // If no callback is provided simply return the result of the function return this . fn . apply ( context , this . _arguments ) ; } } }
Calls the function

Will return the result if not async and no callback is provided

@param  {Object} context (optional)
@param  {Function} callback
Calls the function