docs: function applyEscape( options , ... args ) {
  	var fn , newOptions , wrapOptions ;
  
  	// Cause trouble because the shutting down process itself needs to send escape sequences asynchrnonously
  	//if ( options.root.shutdown && ! options.str ) { return options.root ; }
  
  	if ( options.bounded ) { args = options.bounded.concat( args ) ; }
  
  	//console.error( args ) ;
  	if ( options.bind ) {
  		newOptions = Object.assign( {} , options , { bind: false , bounded: args } ) ;
  		fn = applyEscape.bind( this , newOptions ) ;
  
  		// Still a nasty hack...
  		Object.setPrototypeOf( fn , Object.getPrototypeOf( options.root ) ) ;   // jshint ignore:line
  		fn.apply = Function.prototype.apply ;
  		fn.root = options.root ;
  		fn.options = newOptions ;
  
  		return fn ;
  	}
  
  	var onFormat = [ options.on ] , output , on , off ;
  	var action = args[ options.params ] ;
  
  	// If not enough arguments, return right now
  	// Well... what about term.up(), term.previousLine(), and so on?
  	//if ( arguments.length < 1 + options.params && ( action === null || action === false ) ) { return options.root ; }
  
  	if ( options.params ) {
  		onFormat = onFormat.concat( args.slice( 0 , options.params ) ) ;
  	}
  
  	//console.log( '\n>>> Action:' , action , '<<<\n' ) ;
  	//console.log( 'Attributes:' , attributes ) ;
  	if ( action === undefined || action === true ) {
  		on = options.onHasFormatting ? options.root.format( ... onFormat ) : options.on ;
  		if ( options.str ) { return on ; }
  		options.out.write( on ) ;
  		return options.root ;
  	}
  
  	if ( action === null || action === false ) {
  		off = options.offHasFormatting ? options.root.format( options.off ) : options.off ;
  		if ( options.str ) { return off ; }
  		options.out.write( off ) ;
  		return options.root ;
  	}
  
  	if ( typeof action !== 'string' ) {
  		if ( typeof action.toString === 'function' ) { action = action.toString() ; }
  		else { action = '' ; }
  	}
  
  	// So we have got a string
  
  	on = options.onHasFormatting ? options.root.format( ... onFormat ) : options.on ;
  
  	if ( options.markupOnly ) {
  		action = options.root.markup( ... args.slice( options.params ) ) ;
  	}
  	else if ( ! options.noFormat ) {
  		action = options.root.format( ... args.slice( options.params ) ) ;
  	}
  
  	if ( options.wrap ) {
  		if ( options.root.wrapOptions.x && options.root.wrapOptions.x > 1 ) {
  			wrapOptions = {
  				width: options.root.wrapOptions.width || options.root.width - options.root.wrapOptions.x + 1 ,
  				glue: '\n' + options.root.str.column( options.root.wrapOptions.x ) ,
  				offset: options.root.wrapOptions.offset ,
  				updateOffset: true ,
  				skipFn: termkit.escapeSequenceSkipFn
  			} ;
  
  			action = string.wordwrap( action , wrapOptions ) ;
  
  			if ( ! options.root.wrapOptions.continue ) {
  				action = options.root.str.column( options.root.wrapOptions.x ) + action ;
  			}
  
  			options.root.wrapOptions.continue = true ;
  			options.root.wrapOptions.offset = wrapOptions.offset ;
  		}
  		else {
  			wrapOptions = {
  				width: options.root.wrapOptions.width || options.root.width ,
  				glue: '\n' ,
  				offset: options.root.wrapOptions.offset ,
  				updateOffset: true ,
  				skipFn: termkit.escapeSequenceSkipFn
  			} ;
  
  			action = string.wordwrap( action , wrapOptions ) ;
  			options.root.wrapOptions.continue = true ;
  			options.root.wrapOptions.offset = wrapOptions.offset ;
  		}
  	}
  	else {
  		// All non-wrapped string display reset the offset
  		options.root.wrapOptions.continue = false ;
  		options.root.wrapOptions.offset = 0 ;
  	}
  
  	off = options.offHasFormatting ? options.root.format( options.off ) : options.off ;
  
  	if ( options.forceStyleOnReset ) {
  		action = action.replace( new RegExp( string.escape.regExp( options.root.optimized.styleReset ) , 'g' ) , options.root.optimized.styleReset + on ) ;
  	}
  
  	if ( options.root.resetString ) {
  		output = options.root.resetString + on + action + off + options.root.resetString ;
  	}
  	else {
  		output = on + action + off ;
  	}
  
  	// tmp hack?
  	if ( options.crlf ) { output = output.replace( /\n/g , '\r\n' ) ; }
  
  	if ( options.str ) { return output ; }
  
  	options.out.write( output ) ;
  
  	return options.root ;
  }