code: function defineComponent(/*mixins*/) {
        // unpacking arguments by hand benchmarked faster
        var l = arguments.length;
        var mixins = new Array(l);
        for (var i = 0; i < l; i++) {
          mixins[i] = arguments[i];
        }
  
        var Component = function() {};
  
        Component.toString = Component.prototype.toString = prettyPrintMixins;
        if (debug.enabled) {
          Component.describe = Component.prototype.describe = Component.toString();
        }
  
        // 'options' is optional hash to be merged with 'defaults' in the component definition
        Component.attachTo = attachTo;
        // enables extension of existing "base" Components
        Component.mixin = function() {
          var newComponent = defineComponent(); //TODO: fix pretty print
          var newPrototype = Object.create(Component.prototype);
          newPrototype.mixedIn = [].concat(Component.prototype.mixedIn);
          newPrototype.defaults = utils.merge(Component.prototype.defaults);
          newPrototype.attrDef = Component.prototype.attrDef;
          compose.mixin(newPrototype, arguments);
          newComponent.prototype = newPrototype;
          newComponent.prototype.constructor = newComponent;
          return newComponent;
        };
        Component.teardownAll = teardownAll;
  
        // prepend common mixins to supplied list, then mixin all flavors
        if (debug.enabled) {
          mixins.unshift(withLogging);
        }
        mixins.unshift(withBase, advice.withAdvice, registry.withRegistration);
        compose.mixin(Component.prototype, mixins);
  
        return Component;
      }
docs: define the constructor for a custom component type takes an unlimited number of mixin functions as arguments typical api call with 3 mixins: defineComponent(timeline, withTweetCapability, withScrollCapability);