code: function (notification) {
      var self = this;
  
      var collection = self._collectionForMessage(notification);
  
      if (! _.has(self.listenersByCollection, collection)) {
        return;
      }
  
      var listenersForCollection = self.listenersByCollection[collection];
      var callbackIds = [];
      _.each(listenersForCollection, function (l, id) {
        if (self._matches(notification, l.trigger)) {
          callbackIds.push(id);
        }
      });
  
      // Listener callbacks can yield, so we need to first find all the ones that
      // match in a single iteration over self.listenersByCollection (which can't
      // be mutated during this iteration), and then invoke the matching
      // callbacks, checking before each call to ensure they haven't stopped.
      // Note that we don't have to check that
      // self.listenersByCollection[collection] still === listenersForCollection,
      // because the only way that stops being true is if listenersForCollection
      // first gets reduced down to the empty object (and then never gets
      // increased again).
      _.each(callbackIds, function (id) {
        if (_.has(listenersForCollection, id)) {
          listenersForCollection[id].callback(notification);
        }
      });
    }
docs: Fire the provided 'notification' (an object whose attribute values are all JSON-compatibile) -- inform all matching listeners (registered with listen()).  If fire() is called inside a write fence, then each of the listener callbacks will be called inside the write fence as well.  The listeners may be invoked in parallel, rather than serially.