private void populateDeclaredFields(Class<?> modelClass, HashMap<String, Field> modelFields, ArrayList<Field> idField) {
		if( null != modelClass) {
			// Fill from the top of the hierarchy. The duplicated ModelFields that will remain will be the
			// ones which are more specific in the hierarchy.
			populateDeclaredFields(modelClass.getSuperclass(), modelFields, idField);
			
			for( Field f : modelClass.getDeclaredFields() ) {
				String annotationValue = null;
				
				if( f.isAnnotationPresent(ModelId.class) ) {
					annotationValue = f.getAnnotation(ModelId.class).value();
					
					assert idField.isEmpty() : "You have more than one ModelId annotation in your model. That's incorrect.";
					if(idField.size() > 0) {
						idField.remove(0);
					}
						
					idField.add(f);
				}else if( f.isAnnotationPresent(ModelField.class) ) {
					annotationValue = f.getAnnotation(ModelField.class).value();
				}else{
					continue;
				}

				String name = (null == annotationValue || annotationValue.isEmpty()) ? f.getName() : annotationValue;
				assert !modelFields.containsKey(name) : "This modelField name it's been overridden";

				modelFields.put(name, f);
			}
		}
	}