docs: function buildClass(base, def) {
  
      var parent;
  
      if (def === void 0) {
  
          // If no base class is specified, then Object.prototype
          // is the parent prototype
          def = base;
          base = null;
          parent = Object.prototype;
  
      } else if (base === null) {
  
          // If the base is null, then then then the parent prototype is null
          parent = null;
  
      } else if (typeof base === "function") {
  
          parent = base.prototype;
  
          // Prototype must be null or an object
          if (parent !== null && Object(parent) !== parent)
              parent = void 0;
      }
  
      if (parent === void 0)
          throw new TypeError;
  
      // Create the prototype object
      var proto = Object.create(parent),
          statics = {};
  
      function __(target, obj) {
  
          if (!obj) mergeProperties(proto, target, false);
          else mergeProperties(target, obj, false);
      }
  
      __.static = function(obj) { return mergeProperties(statics, obj, false); };
      __.super = parent;
      __.csuper = base || Function.prototype;
  
      // Generate method collections, closing over super bindings
      def(__);
  
      var ctor = proto.constructor;
  
      // Set constructor's prototype
      ctor.prototype = proto;
  
      // Set class "static" methods
      forEachDesc(statics, function(name, desc) { return Object.defineProperty(ctor, name, desc); });
  
      // Inherit from base constructor
      if (base && ctor.__proto__)
          Object.setPrototypeOf(ctor, base);
  
      return ctor;
  }