( f:(...args: any[]) => P, generator: ( ) => T ): (...args: any[]) => P { var sv = this return function( ): P { try { sv.stack.push( generator( ) ) return f.apply( this, arguments ) } finally { sv.stack.pop( ) } } } recover( ): T { if( this.defined( ) ){ return this.stack[ this.stack.length - 1 ] } else { throw new Error( this.error_message ) } } defined( ): boolean { return this.stack.length > 0 } }