docs: protected void buildSetMethod(ClassVisitor cw,
                                    ClassDefinition classDef,
                                    FieldDefinition fieldDef) {
          MethodVisitor mv;
          // set method
          {
              mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
                      fieldDef.getWriteMethod(),
                      Type.getMethodDescriptor( Type.VOID_TYPE,
                              new Type[]{Type.getType( BuildUtils.getTypeDescriptor( fieldDef.getTypeName() ) )} ),
                      null,
                      null );
              mv.visitCode();
              Label l0 = null;
              if ( this.debug ) {
                  l0 = new Label();
                  mv.visitLabel( l0 );
              }
              mv.visitVarInsn( Opcodes.ALOAD, 0 );
  
              if ( classDef.isTraitable() && classDef.isFullTraiting() ) {
                  updateTraitableField( mv, classDef, fieldDef );
              } else {
                  mv.visitVarInsn( Type.getType( BuildUtils.getTypeDescriptor( fieldDef.getTypeName() ) ).getOpcode( Opcodes.ILOAD ), 1 );
              }
  
              if ( ! fieldDef.hasOverride() ) {
                  mv.visitFieldInsn( Opcodes.PUTFIELD,
                                     BuildUtils.getInternalType( classDef.getClassName() ),
                                     fieldDef.getName(),
                                     BuildUtils.getTypeDescriptor( fieldDef.getTypeName() ) );
              } else {
                  mv.visitMethodInsn( INVOKESPECIAL,
                                      BuildUtils.getInternalType( classDef.getSuperClass() ),
                                      BuildUtils.setterName( fieldDef.getName(), fieldDef.getOverriding() ),
                                      Type.getMethodDescriptor( Type.VOID_TYPE,
                                                                new Type[]{Type.getType( BuildUtils.getTypeDescriptor( fieldDef.getOverriding()) )} ),
                                      false );
              }
  
              if (classDef.isReactive()) {
                  mv.visitVarInsn( ALOAD, 0 );
                  mv.visitMethodInsn( INVOKEVIRTUAL, BuildUtils.getInternalType( classDef.getClassName() ), "notifyModification", "()V", false );
              }
  
              mv.visitInsn( Opcodes.RETURN );
              Label l1 = null;
              if ( this.debug ) {
                  l1 = new Label();
                  mv.visitLabel( l1 );
                  mv.visitLocalVariable( "this",
                          BuildUtils.getTypeDescriptor( classDef.getClassName() ),
                          null,
                          l0,
                          l1,
                          0 );
              }
              mv.visitMaxs( 0, 0 );
              mv.visitEnd();
          }
      }