private <T, R> R convert(ConvertType convertType, TypeConverter<T, R> typeConverter, T source, Class<R> targetClass) {
		switch (convertType) {
			case identity:
				return (R) source;
			case none:
				return null; // TODO: later, return default null
			case converter:
				return typeConverter.convert(source);
			case complex:
				return as(targetClass, source);
			default:
				throw new RuntimeException("Mapper.convert: no ConvertType for " + source);
		}
	}