docs: function inherit() {
      var args = arguments,
          withMixins = isArray(args[0]),
          hasBase = withMixins || isFunction(args[0]),
          base = hasBase? withMixins? applyMixins(args[0]) : args[0] : emptyBase,
          props = args[hasBase? 1 : 0] || {},
          staticProps = args[hasBase? 2 : 1],
          res = props.__constructor || (hasBase && base.prototype.__constructor)?
              function() {
                  return this.__constructor.apply(this, arguments);
              } :
              hasBase?
                  function() {
                      return base.apply(this, arguments);
                  } :
                  function() {};
  
      if(!hasBase) {
          res.prototype = props;
          res.prototype.__self = res.prototype.constructor = res;
          return extend(res, staticProps);
      }
  
      extend(res, base);
  
      res.__parent = base;
  
      var basePtp = base.prototype,
          resPtp = res.prototype = objCreate(basePtp);
  
      resPtp.__self = resPtp.constructor = res;
  
      props && override(basePtp, resPtp, props);
      staticProps && override(base, res, staticProps);
  
      return res;
  }