public void setter(Object obj, String value)
        throws IllegalArgumentException {
        Method getMethod = getGetMethod();
        Class<?> fieldType = getMethodReturnType(getMethod);
        Method setMethod = getSetMethod(fieldType);

        if (fieldType == String.class) {
            try {
                setMethod.invoke(obj, value);
            } catch (Exception e) {
                throw new IllegalArgumentException(setMethod.getName()
                                                   + "(obj, " + value + ")): "
                                                   + e.toString());
            }
        } else {
            Method convertMethod = getFromStringConverter(fieldType);
            Object result = null;

            if (fieldType.isEnum()) {
                try {
                    result = convertMethod.invoke(null, fieldType, value);
                } catch (Exception e) {
                    throw new IllegalArgumentException(convertMethod.getName()
                                                       + "(null, " + fieldType.getName()
                                                       + ", " + value + "):"
                                                       + e.toString());
                }
            } else {
                try {
                    result = convertMethod.invoke(null, value);
                } catch (Exception e) {
                    throw new IllegalArgumentException(convertMethod.getName()
                                                       + "(null, " + value + "):"
                                                       + e.toString());
                }
            }
            try {
                setMethod.invoke(obj, result);
            } catch (Exception e) {
                throw new IllegalArgumentException(setMethod.getName()
                                                   + "(result): "
                                                   + e.toString());
            }
        }
    }