docs: void setFieldValue(final Object containingObj, final Object value) {
          try {
              if (value == null) {
                  if (primitiveType != PrimitiveType.NON_PRIMITIVE) {
                      throw new IllegalArgumentException("Tried to set primitive-typed field "
                              + field.getDeclaringClass().getName() + "." + field.getName() + " to null value");
                  }
                  field.set(containingObj, null);
                  return;
              }
              switch (primitiveType) {
              case NON_PRIMITIVE:
                  field.set(containingObj, value);
                  break;
              case INTEGER:
                  if (!(value instanceof Integer)) {
                      throw new IllegalArgumentException(
                              "Expected value of type Integer; got " + value.getClass().getName());
                  }
                  field.setInt(containingObj, (Integer) value);
                  break;
              case LONG:
                  if (!(value instanceof Long)) {
                      throw new IllegalArgumentException(
                              "Expected value of type Long; got " + value.getClass().getName());
                  }
                  field.setLong(containingObj, (Long) value);
                  break;
              case SHORT:
                  if (!(value instanceof Short)) {
                      throw new IllegalArgumentException(
                              "Expected value of type Short; got " + value.getClass().getName());
                  }
                  field.setShort(containingObj, (Short) value);
                  break;
              case DOUBLE:
                  if (!(value instanceof Double)) {
                      throw new IllegalArgumentException(
                              "Expected value of type Double; got " + value.getClass().getName());
                  }
                  field.setDouble(containingObj, (Double) value);
                  break;
              case FLOAT:
                  if (!(value instanceof Float)) {
                      throw new IllegalArgumentException(
                              "Expected value of type Float; got " + value.getClass().getName());
                  }
                  field.setFloat(containingObj, (Float) value);
                  break;
              case BOOLEAN:
                  if (!(value instanceof Boolean)) {
                      throw new IllegalArgumentException(
                              "Expected value of type Boolean; got " + value.getClass().getName());
                  }
                  field.setBoolean(containingObj, (Boolean) value);
                  break;
              case BYTE:
                  if (!(value instanceof Byte)) {
                      throw new IllegalArgumentException(
                              "Expected value of type Byte; got " + value.getClass().getName());
                  }
                  field.setByte(containingObj, (Byte) value);
                  break;
              case CHARACTER:
                  if (!(value instanceof Character)) {
                      throw new IllegalArgumentException(
                              "Expected value of type Character; got " + value.getClass().getName());
                  }
                  field.setChar(containingObj, (Character) value);
                  break;
              default:
                  throw new IllegalArgumentException();
              }
          } catch (IllegalArgumentException | IllegalAccessException e) {
              throw new IllegalArgumentException(
                      "Could not set field " + field.getDeclaringClass().getName() + "." + field.getName(), e);
          }
      }