docs: function StarLog(options) {
      options = options || {};
  
      // Override prototype definitions if and only if supplied in options
      ['log', 'targets', 'listener'].forEach(function(key) {
          if (options[key]) { this[key] = options[key]; }
      }, this);
  
      var defaultTarget = options.targets || this.targets,
          defaultListener = options.listener || this.listener,
          listenerDictionary = options.listenerDictionary || {},
          targetsDictionary = options.targetsDictionary || {},
          loggers = options.loggers,
          eventStrings;
  
      if (loggers) {
          eventStrings = Object.keys(loggers);
      } else if (options.events) {
          loggers = {};
          eventStrings = options.events;
      } else if (options.pattern && options.select) {
          loggers = {};
          eventStrings = arrayify(options.select).reduce(function(matches, object) {
              match.call(object, options.pattern, options.match).forEach(function (match) {
                  if (matches.indexOf(match) < 0) {
                      matches.push(match);
                  }
              });
              return matches;
          }, []);
      } else {
          throw new Error('Expected `options.loggers`, `options.events`, or `options.pattern` and `options.select` to be defined.');
      }
  
      var starlog = this;
  
      /**
       * Dictionary of event strings with listener and target(s).
       * @type {Object.<eventType, starlogger>}
       */
      this.events = eventStrings.reduce(function(clone, eventString) {
          var logger = Object.assign({}, loggers[eventString]); // clone each logger
  
          // bind the listener to starlog for `this.log` access to Starlog#log from within listener
          logger.listener = (logger.listener || listenerDictionary[eventString] || defaultListener).bind(starlog);
          logger.targets = arrayify(logger.targets || targetsDictionary[eventString] || defaultTarget);
  
          clone[eventString] = logger;
  
          return clone;
      }, {});
  }