inherit<M extends T> method

ClassInfo<M> inherit<M extends T>({
  1. String? name,
  2. M newInstance(
    1. JsScript,
    2. List argv
    )?,
  3. Map<String, JsFunction<M>> functions = const {},
  4. Map<String, JsField<M, dynamic>> fields = const {},
})

Implementation

ClassInfo<M> inherit<M extends T>({
  String? name,
  M Function(JsScript, List argv)? newInstance,
  Map<String, JsFunction<M>> functions = const {},
  Map<String, JsField<M, dynamic>> fields = const {},
}) {
  List<_MemberInfo> members = List.from(this.members);
  if (newInstance != null) {
    members[0] = _MemberInfo(
        this.name,
        MEMBER_CONSTRUCTOR,
            (script, argv) => newInstance(script, argv)
    );
  }
  functions.forEach((name, func) {
    members.add(_MemberInfo(
        name,
        MEMBER_FUNCTION | (func.isStatic ? MEMBER_STATIC : 0),
        func.function
    ));
  });
  fields.forEach((name, field) {
    if (field.getter != null) {
      members.add(_MemberInfo(
          name,
          MEMBER_GETTER | (field.isStatic ? MEMBER_STATIC : 0),
          field.getter!
      ));
    }
    if (field.setter != null) {
      members.add(_MemberInfo(
          name,
          MEMBER_SETTER | (field.isStatic ? MEMBER_STATIC : 0),
          field.setter!
      ));
    }
  });
  return ClassInfo._(
      name: name??M.toString(),
      type: M,
      members: members
  );
}