code: public <T> void registerMethodConstructor(final Class<T> cls, String toStringMethodName) {
          if (cls == null) {
              throw new IllegalArgumentException("Class must not be null");
          }
          if (toStringMethodName == null) {
              throw new IllegalArgumentException("Method name must not be null");
          }
          if (this == INSTANCE) {
              throw new IllegalStateException("Global singleton cannot be extended");
          }
          Method toString = findToStringMethod(cls, toStringMethodName);
          Constructor<T> fromString = findFromStringConstructorByType(cls);
          MethodConstructorStringConverter<T> converter = new MethodConstructorStringConverter<T>(cls, toString, fromString);
          registered.putIfAbsent(cls, converter);
      }
docs: Registers a converter for a specific type by method and constructor.
  <p>
  This method allows the converter to be used when the target class cannot have annotations added.
  The two method name and constructor must obey the same rules as defined by the annotations
  {@link ToString} and {@link FromString}.
  The converter will be used for subclasses unless overidden.
  <p>
  No new converters may be registered for the global singleton.
  <p>
  For example, {@code convert.registerMethodConstructor(Distance.class, "toString");}
  
  @param <T>  the type of the converter
  @param cls  the class to register a converter for, not null
  @param toStringMethodName  the name of the method converting to a string, not null
  @throws IllegalArgumentException if the class or method name are null or invalid
  @throws IllegalStateException if trying to alter the global singleton