mixinUpdate(newMixins, oldMixins, deferred) {
    var componentsUpdated = AEntity.componentsUpdated;
    var component;
    var mixinEl;
    var mixinIds;
    var i;
    var self = this;
    if (!deferred) {
      oldMixins = oldMixins || this.getAttribute('mixin');
    }
    if (!this.hasLoaded) {
      this.addEventListener('loaded-private', function () {
        self.mixinUpdate(newMixins, oldMixins, true);
      }, ONCE);
      return;
    }
    mixinIds = this.updateMixins(newMixins, oldMixins);

    // Loop over current mixins.
    componentsUpdated.length = 0;
    for (i = 0; i < this.mixinEls.length; i++) {
      for (component in this.mixinEls[i].componentCache) {
        if (componentsUpdated.indexOf(component) === -1) {
          if (this.components[component]) {
            // Update. Just rebuild data.
            this.components[component].handleMixinUpdate();
          } else {
            // Init. buildData will gather mixin values.
            this.initComponent(component, null);
          }
          componentsUpdated.push(component);
        }
      }
    }

    // Loop over old mixins to call for data rebuild.
    for (i = 0; i < mixinIds.oldMixinIds.length; i++) {
      mixinEl = document.getElementById(mixinIds.oldMixinIds[i]);
      if (!mixinEl) {
        continue;
      }
      for (component in mixinEl.componentCache) {
        if (componentsUpdated.indexOf(component) === -1) {
          if (this.components[component]) {
            if (this.getDOMAttribute(component)) {
              // Update component if explicitly defined.
              this.components[component].handleMixinUpdate();
            } else {
              // Remove component if not explicitly defined.
              this.removeComponent(component, true);
            }
          }
        }
      }
    }
  }
When mixins updated, trigger init or optimized-update of relevant components.