@SuppressWarnings("unchecked")
	public static <T> T getPropertyValue(Class<?> requiredType, String propertyName, Object instance) {
		if(requiredType == null) {
			throw new IllegalArgumentException(String.format(ARG_EXCEPTION_MSG, "requiredType"));
		}
		if(propertyName == null) {
			throw new IllegalArgumentException(String.format(ARG_EXCEPTION_MSG, "propertyName"));
		}
		if(instance == null) {
			throw new IllegalArgumentException(String.format(ARG_EXCEPTION_MSG, "Object instance"));
		}
		if(!(Comparable.class.isAssignableFrom(requiredType))) {
			throw new IllegalArgumentException(String.format("Object %s is not an instance of Comparable!", instance.getClass().getName()));
		}
		
		T propertyValue = null;
		
		try {
			PropertyDescriptor descriptor = new PropertyDescriptor(propertyName, instance.getClass());
			Method readMethod = descriptor.getReadMethod();
			if(readMethod == null) {
				throw new IllegalStateException(
						String.format(PROP_EXCEPTION_MSG, propertyName, instance.getClass().getName(), "readable"));
			}
			if(requiredType.isAssignableFrom(readMethod.getReturnType())) {
				try {
					Object propertyValueObject = readMethod.invoke(instance);
					propertyValue = (T) propertyValueObject;
				} catch(Exception e) {
					e.printStackTrace(); // unable to invoke readMethod
				}
			}
		} catch(IntrospectionException e) {
			throw new IllegalArgumentException(
					String.format(PROP_EXCEPTION_MSG, propertyName, instance.getClass().getName(), "defined"), 
					e);
		}
		
		return propertyValue;
	}