docs: function inherits(ctor, superCtor, staticInherit) {
    var v  = (ctor.hasOwnProperty('super_') && ctor.super_) || getPrototypeOf(ctor);
    var mixinCtor = ctor.mixinCtor_;
    if (mixinCtor && v === mixinCtor) {
      ctor = mixinCtor;
      v = (ctor.hasOwnProperty('super_') && ctor.super_) || getPrototypeOf(ctor);
    }
    var result = false;
    if (!isInheritedFrom(ctor, superCtor) && !isInheritedFrom(superCtor, ctor)) {
      inheritsDirectly(ctor, superCtor, staticInherit);
      // patch the missing prototype chain if exists ctor.super.
      while (v != null && v !== objectSuperCtor && superCtor !== v) {
        ctor = superCtor;
        superCtor = v;
        inheritsDirectly(ctor, superCtor, staticInherit);
        v = (ctor.hasOwnProperty('super_') && ctor.super_) || getPrototypeOf(ctor);
      }
      result = true;
    }
    return result;
  }