| // This file should be ES5 compatible | 
| /* eslint prefer-spread:0, no-var:0, prefer-reflect:0, no-magic-numbers:0 */ | 
| 'use strict' | 
|   | 
| module.exports = (function () { | 
|     // Import Events | 
|     var events = require('events') | 
|   | 
|     // Export Domain | 
|     var domain = {} | 
|     domain.createDomain = domain.create = function () { | 
|         var d = new events.EventEmitter() | 
|   | 
|         function emitError (e) { | 
|             d.emit('error', e) | 
|         } | 
|   | 
|         d.add = function (emitter) { | 
|             emitter.on('error', emitError) | 
|         } | 
|         d.remove = function (emitter) { | 
|             emitter.removeListener('error', emitError) | 
|         } | 
|         d.bind = function (fn) { | 
|             return function () { | 
|                 var args = Array.prototype.slice.call(arguments) | 
|                 try { | 
|                     fn.apply(null, args) | 
|                 } | 
|                 catch (err) { | 
|                     emitError(err) | 
|                 } | 
|             } | 
|         } | 
|         d.intercept = function (fn) { | 
|             return function (err) { | 
|                 if ( err ) { | 
|                     emitError(err) | 
|                 } | 
|                 else { | 
|                     var args = Array.prototype.slice.call(arguments, 1) | 
|                     try { | 
|                         fn.apply(null, args) | 
|                     } | 
|                     catch (err) { | 
|                         emitError(err) | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|         d.run = function (fn) { | 
|             try { | 
|                 fn() | 
|             } | 
|             catch (err) { | 
|                 emitError(err) | 
|             } | 
|             return this | 
|         } | 
|         d.dispose = function () { | 
|             this.removeAllListeners() | 
|             return this | 
|         } | 
|         d.enter = d.exit = function () { | 
|             return this | 
|         } | 
|         return d | 
|     } | 
|     return domain | 
| }).call(this) |