code: function transformMixin(trait) {
      if (isObject(trait)) return trait;
      else {
        var i, key, keys, object, proto;
        if (trait.isClass) {
          if (trait.length) {
            warn((trait.name || 'Class') + ' should not expect arguments');
          }
          for (
            object = {init: trait},
            proto = trait.prototype;
            proto && proto !== Object.prototype;
            proto = gPO(proto)
          ) {
            for (i = 0, keys = oK(proto); i < keys.length; i++) {
              key = keys[i];
              if (isNotASpecialKey(key, false) && !hOP.call(object, key)) {
                defineProperty(object, key, gOPD(proto, key));
              }
            }
          }
        } else {
          for (
            i = 0,
            object = {},
            proto = trait({}),
            keys = oK(proto);
            i < keys.length; i++
          ) {
            key = keys[i];
            if (key !== INIT) {
              // if this key is the mixin one
              if (~key.toString().indexOf('mixin:init') && isArray(proto[key])) {
                // set the init simply as own method
                object.init = proto[key][0];
              } else {
                // simply assign the descriptor
                defineProperty(object, key, gOPD(proto, key));
              }
            }
          }
        }
        return object;
      }
    }
docs: will eventually convert classes or constructors into trait objects, before assigning them as such