code: function(loud) {
        this.changed = {};
        var already = {};
        var triggers = [];
        var current = this._currentAttributes;
        var changes = this._changes;
  
        // Loop through the current queue of potential model changes.
        for (var i = changes.length - 2; i >= 0; i -= 2) {
          var key = changes[i], val = changes[i + 1];
          if (already[key]) continue;
          already[key] = true;
  
          // Check if the attribute has been modified since the last change,
          // and update `this.changed` accordingly. If we're inside of a `change`
          // call, also add a trigger to the list.
          if (current[key] !== val) {
            this.changed[key] = val;
            if (!loud) continue;
            triggers.push(key, val);
            current[key] = val;
          }
        }
        if (loud) this._changes = [];
  
        // Signals `this.changed` is current to prevent duplicate calls from `this.hasChanged`.
        this._hasComputed = true;
        return triggers;
      }
docs: Looking at the built up list of `set` attribute changes, compute how many of the attributes have actually changed. If `loud`, return a boiled-down list of only the real changes.