docs: @Override
      public Object convert(String value) {
          Object converted = null;
          if (value != null) { //if the value is null then we always return null
              try {
                  if (this.ctor != null) {
                      converted = this.ctor.newInstance(value);
                  } else if (this.valueOfMethod != null) {
                      converted = this.valueOfMethod.invoke(null, value);
                  } else if (this.parseMethod != null) {
                      converted = this.parseMethod.invoke(null, value);
                  }
              } catch (InvocationTargetException e) {
                  Throwable cause = e.getCause();
                  if (cause instanceof IllegalArgumentException) {
                      throw (IllegalArgumentException) cause;
                  } else {
                      throw new ConversionException(cause);
                  }
              } catch (IllegalAccessException | InstantiationException e) {
                  throw new ConversionException(e);
              }
          }
          return converted;
      }