protected void invokePut(
      MethodVisitor mv,
      String wrapperName,
      ClassDefinition core,
      String fieldName,
      FieldDefinition field) {
    mv.visitLdcInsn(fieldName);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(
        INVOKEVIRTUAL,
        Type.getInternalName(String.class),
        "equals",
        "(" + Type.getDescriptor(Object.class) + ")Z");
    Label l1 = new Label();
    mv.visitJumpInsn(IFEQ, l1);

    mv.visitVarInsn(ALOAD, 2);
    if (BuildUtils.isPrimitive(field.getTypeName())) {
      TraitFactory.primitiveValue(mv, field.getTypeName());
      mv.visitVarInsn(BuildUtils.storeType(field.getTypeName()), 3);
      TraitFactory.invokeInjector(mv, wrapperName, trait, core, field, false, 3);
    } else {
      TraitFactory.invokeInjector(mv, wrapperName, trait, core, field, false, 2);
    }

    mv.visitVarInsn(ALOAD, 2);
    mv.visitInsn(ARETURN);
    mv.visitLabel(l1);
  }