function Reactor() {
	    var config = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];

	    _classCallCheck(this, Reactor);

	    var debug = !!config.debug;
	    var baseOptions = debug ? _reactorRecords.DEBUG_OPTIONS : _reactorRecords.PROD_OPTIONS;
	    // if defined, merge the custom implementation over the noop logger to avoid undefined lookups,
	    // otherwise, just use the built-in console group logger
	    var logger = config.logger ? (0, _utils.extend)({}, _logging.NoopLogger, config.logger) : _logging.NoopLogger;
	    if (!config.logger && debug) {
	      logger = _logging.ConsoleGroupLogger;
	    }
	    var initialReactorState = new _reactorRecords.ReactorState({
	      debug: debug,
	      cache: config.cache || (0, _reactorCache.DefaultCache)(),
	      logger: logger,
	      // merge config options with the defaults
	      options: baseOptions.merge(config.options || {})
	    });

	    this.prevReactorState = initialReactorState;
	    this.reactorState = initialReactorState;
	    this.observerState = new _reactorRecords.ObserverState();

	    this.ReactMixin = (0, _createReactMixin2['default'])(this);

	    // keep track of the depth of batch nesting
	    this.__batchDepth = 0;

	    // keep track if we are currently dispatching
	    this.__isDispatching = false;
	  }
State is stored in NuclearJS Reactors.  Reactors
contain a 'state' object which is an Immutable.Map

The only way Reactors can change state is by reacting to
messages.  To update state, Reactor's dispatch messages to
all registered cores, and the core returns it's new
state based on the message