@SuppressWarnings("unchecked")
	protected T createObject(String line) {
		String vals[] = line.split(separator);

		// Create a new instance
		T tObj;
		try {
			tObj = (T) clazz.newInstance();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

		// Populate values
		int maxFieldNum = Math.min(vals.length, fieldNames.length);
		for (int i = 0; i < maxFieldNum; i++) {
			// If the name of the field is empty => Skip this field
			if (!fieldNames[i].isEmpty()) {
				Field field = fieldByName.get(fieldNames[i]);

				// Assign each field
				String typeName = field.getType().getCanonicalName();
				try {
					String valOri = vals[i];
					if (typeName.equals("java.lang.String")) field.set(tObj, valOri);
					else {
						// Numeric values have to be trimmed
						String valTrim = valOri.trim();

						if (typeName.equals("int")) field.setInt(tObj, Gpr.parseIntSafe(valTrim));
						else if (typeName.equals("long")) field.setLong(tObj, Gpr.parseLongSafe(valTrim));
						else if (typeName.equals("double")) field.setDouble(tObj, Gpr.parseDoubleSafe(valTrim));
						else if (typeName.equals("float")) field.setFloat(tObj, Gpr.parseFloatSafe(valTrim));
						else throw new RuntimeException("Unsoported parsing for object type '" + typeName + "' cannot be parsed.");
					}
				} catch (Exception e) {
					throw new RuntimeException(e);
				}
			}
		}

		return tObj;
	}