public String getter(Object obj)
        throws IllegalArgumentException {
        Method getMethod = getGetMethod();
        Class<?> fieldType = getMethodReturnType(getMethod);

        if (fieldType == String.class) {
            try {
                return (String) getMethod.invoke(obj);
            } catch (Exception e) {
                throw new IllegalArgumentException(getMethod.getName()
                                                   + "(obj)): "
                                                   + e.toString());
            }
        } else {
            Object result = null;
            try {
                result = getMethod.invoke(obj);
            } catch (Exception e) {
                throw new IllegalArgumentException(getMethod.getName()
                                                   + "(obj): "
                                                   + e.toString());
            }
            Method convertMethod = getToStringConverter(fieldType);
            if (Modifier.isStatic(convertMethod.getModifiers())) {
                try {
                    return (String) convertMethod.invoke(null, result);
                } catch (Exception e) {
                    throw new IllegalArgumentException(convertMethod.getName()
                                                       + "(null, result): "
                                                       + e.toString());
                }
            } else {
                try {
                    return (String) convertMethod.invoke(result);
                } catch (Exception e) {
                    throw new IllegalArgumentException(convertMethod.getName()
                                                       + "(result): "
                                                       + e.toString());
                }
            }
        }
    }