oknow.js
function(fn, syntheticArgs) {
		var $this = this;
		syntheticArgs = syntheticArgs || [];
		/**
		 * Ensure to have it in the next event loop for better async
		 */
		var processResponder = function() {
			try {
				if (fn) {
					/**
					 * Insert a done() or ok() argument to other needed arguments
					 */
					syntheticArgs.unshift(function() {
						/**
						 * Call the next in queue
						 */
						$this.next.apply($this, arguments);
					});
					/**
					 * Call the function finally
					 */
					fn.apply(this, syntheticArgs);
				} else {
					syntheticArgs = syntheticArgs || [];
					/**
					 * If no function passed, call the next in queue
					 */
					$this.next.apply(this, syntheticArgs);
				}
			} catch(e) {
				/**
				 * An error caught is thrown directly to the catch handler, if any
				 */
				if (this.onCatch) {
					this.onCatch(e);
				} else {
					throw e;
				}
			}
		};
		if (typeof process === "undefined") {
			processResponder();
		} else {
			process.nextTick(processResponder);
		}
		/**
		 * Return self for chaining
		 */
		return this;
	}
function(fn, syntheticArgs) {
		var $this = this;
		syntheticArgs = syntheticArgs || [];
		/**
		 * Ensure to have it in the next event loop for better async
		 */
		var processResponder = function() {
			try {
				if (fn) {
					/**
					 * Insert a done() or ok() argument to other needed arguments
					 */
					syntheticArgs.unshift(function() {
						/**
						 * Call the next in queue
						 */
						$this.next.apply($this, arguments);
					});
					/**
					 * Call the function finally
					 */
					fn.apply(this, syntheticArgs);
				} else {
					syntheticArgs = syntheticArgs || [];
					/**
					 * If no function passed, call the next in queue
					 */
					$this.next.apply(this, syntheticArgs);
				}
			} catch(e) {
				/**
				 * An error caught is thrown directly to the catch handler, if any
				 */
				if (this.onCatch) {
					this.onCatch(e);
				} else {
					throw e;
				}
			}
		};
		if (typeof process === "undefined") {
			processResponder();
		} else {
			process.nextTick(processResponder);
		}
		/**
		 * Return self for chaining
		 */
		return this;
	}
function ( fn , syntheticArgs ) { var $this = this ; syntheticArgs = syntheticArgs || [ ] ; /**
		 * Ensure to have it in the next event loop for better async
		 */ var processResponder = function ( ) { try { if ( fn ) { /**
					 * Insert a done() or ok() argument to other needed arguments
					 */ syntheticArgs . unshift ( function ( ) { /**
						 * Call the next in queue
						 */ $this . next . apply ( $this , arguments ) ; } ) ; /**
					 * Call the function finally
					 */ fn . apply ( this , syntheticArgs ) ; } else { syntheticArgs = syntheticArgs || [ ] ; /**
					 * If no function passed, call the next in queue
					 */ $this . next . apply ( this , syntheticArgs ) ; } } catch ( e ) { /**
				 * An error caught is thrown directly to the catch handler, if any
				 */ if ( this . onCatch ) { this . onCatch ( e ) ; } else { throw e ; } } } ; if ( typeof process === "undefined" ) { processResponder ( ) ; } else { process . nextTick ( processResponder ) ; } /**
		 * Return self for chaining
		 */ return this ; }
Executes a given function with provided arguments, and then calls the next one in queue
@param  {Function} fn            Function to execute
@param  {Array}   syntheticArgs 	Arguments to be passed to the function called
@return {Promise}                Returns self object for chaining
Executes a given function with provided arguments and then calls the next one in queue