docs: static void generateMethodsForAttribute(ClassWriter classWriter, XsdAttribute elementAttribute, String returnType, String className, String apiName) {
          String attributeName = ATTRIBUTE_PREFIX + getCleanName(elementAttribute);
          String camelCaseName = attributeName.toLowerCase().charAt(0) + attributeName.substring(1);
          String attributeClassType = getFullClassTypeName(getAttributeName(elementAttribute), apiName);
          String attributeGroupInterfaceType = getFullClassTypeName(className, apiName);
          boolean isInterfaceMethod = isInterfaceMethod(returnType);
          String attrName = firstToLower(ATTRIBUTE_PREFIX + getCleanName(elementAttribute));
          String javaType = getFullJavaType(elementAttribute);
          String containingType;
          String signature;
  
          if (attributeHasEnum(elementAttribute)){
              javaType = getFullClassTypeNameDesc(getEnumName(elementAttribute), apiName);
          }
  
          containingType = javaType;
  
          if (isInterfaceMethod){
              signature = "(" + javaType + ")TT;";
          } else {
              signature = "(" + javaType + ")" + returnType.substring(0, returnType.length() - 1) + "<TZ;>;";
          }
  
          int access = isInterfaceMethod ? ACC_PUBLIC : ACC_PUBLIC + ACC_FINAL;
  
          MethodVisitor mVisitor = classWriter.visitMethod(access, camelCaseName, "(" + javaType + ")" + returnType, signature, null);
          mVisitor.visitLocalVariable(attrName, javaType, null, new Label(), new Label(),1);
          mVisitor.visitCode();
  
          if (attributeHasRestrictions(elementAttribute)){
              mVisitor.visitVarInsn(ALOAD, 1);
              mVisitor.visitMethodInsn(INVOKESTATIC, attributeClassType, "validateRestrictions", "(" + javaType + ")V", false);
          }
  
          mVisitor.visitVarInsn(ALOAD, 0);
  
          if (isInterfaceMethod){
              mVisitor.visitMethodInsn(INVOKEINTERFACE, attributeGroupInterfaceType, "getVisitor", "()" + elementVisitorTypeDesc, true);
          } else {
              mVisitor.visitFieldInsn(GETFIELD, attributeGroupInterfaceType, "visitor", elementVisitorTypeDesc);
          }
  
          mVisitor.visitVarInsn(ALOAD, 1);
  
          if (attributeHasEnum(elementAttribute)){
              containingType = getEnumContainingType(elementAttribute);
  
              mVisitor.visitMethodInsn(INVOKEVIRTUAL, javaType.substring(1, javaType.length() - 1), "getValue", "()" + containingType, false);
          }
  
          if (containingType != null && !containingType.equals(JAVA_STRING_DESC)){
              mVisitor.visitMethodInsn(INVOKEVIRTUAL, JAVA_OBJECT, "toString", "()" + JAVA_STRING_DESC, false);
          }
  
          mVisitor.visitMethodInsn(INVOKEVIRTUAL, elementVisitorType, "visitAttribute" + getCleanName(elementAttribute.getName()), "(" + JAVA_STRING_DESC + ")V", false);
          mVisitor.visitVarInsn(ALOAD, 0);
  
          if (isInterfaceMethod){
              mVisitor.visitMethodInsn(INVOKEINTERFACE, attributeGroupInterfaceType, "self", "()" + elementTypeDesc, true);
          }
  
          mVisitor.visitInsn(ARETURN);
          mVisitor.visitMaxs(3, 2);
          mVisitor.visitEnd();
      }