docs: private static void createCustomAttributeGroup(String apiName){
          ClassWriter classWriter = generateClass(CUSTOM_ATTRIBUTE_GROUP, JAVA_OBJECT, new String[] {ELEMENT}, "<T::" + elementTypeDesc + "Z::" + elementTypeDesc + ">" + JAVA_OBJECT_DESC + "L" + elementType + "<TT;TZ;>;", ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE, apiName);
  
          MethodVisitor mVisitor = classWriter.visitMethod(ACC_PUBLIC, "addAttr", "(" + JAVA_STRING_DESC + JAVA_STRING_DESC +")" + elementTypeDesc, "(" + JAVA_STRING_DESC + JAVA_STRING_DESC +")TT;", null);
          mVisitor.visitLocalVariable("name", JAVA_STRING_DESC, null, new Label(), new Label(),1);
          mVisitor.visitLocalVariable("value", JAVA_STRING_DESC, null, new Label(), new Label(),2);
          mVisitor.visitCode();
          mVisitor.visitVarInsn(ALOAD, 0);
          mVisitor.visitMethodInsn(INVOKEINTERFACE, customAttributeGroupType, "getVisitor", "()" + elementVisitorTypeDesc, true);
          mVisitor.visitVarInsn(ALOAD, 1);
          mVisitor.visitVarInsn(ALOAD, 2);
          mVisitor.visitMethodInsn(INVOKEVIRTUAL, elementVisitorType, "visitAttribute", "(" + JAVA_STRING_DESC + JAVA_STRING_DESC +")V", false);
          mVisitor.visitVarInsn(ALOAD, 0);
          mVisitor.visitMethodInsn(INVOKEINTERFACE, customAttributeGroupType, "self", "()" + elementTypeDesc, true);
          mVisitor.visitInsn(ARETURN);
          mVisitor.visitMaxs(3, 3);
          mVisitor.visitEnd();
  
          writeClassToFile(CUSTOM_ATTRIBUTE_GROUP, classWriter, apiName);
      }