code: function FunctionCall( fn , isAsync , thisArg , ... args ) {
  	this.function = fn ;
  	this.isAsync = isAsync ;
  	this.this = thisArg ;
  	this.args = args ;
  	this.hasThrown = false ;
  	this.error = undefined ;
  	this.return = undefined ;
  
  	try {
  		this.return = this.function.call( this.this || null , ... this.args ) ;
  	}
  	catch ( error ) {
  		this.hasThrown = true ;
  		this.error = error ;
  	}
  
  	if ( this.isAsync ) {
  		if ( this.hasThrown ) {
  			this.promise = Promise.resolve() ;
  		}
  		else {
  			this.promise = Promise.resolve( this.return )
  				.then(
  					value => this.return = value ,
  					error => {
  						this.hasThrown = true ;
  						this.error = error ;
  					}
  				) ;
  		}
  	}
  }
docs: A class for actual function, arguments, return value and thrown error