code: private void forEachFieldDo(FieldCallBack fieldCallBack) {
  		Class<?> clazz = this.getClass();
  		
  		while (true) {
  			
  			Field[] fields = clazz.getDeclaredFields();
  			try {
  				for (Field field : fields) {
  					// FIXME: test skipped cases
  					// skip Logger object
  					if (field.getType() == Logger.class)
  						continue;
  					// skip fields annotated with @Transient
  					if (field.getAnnotation(Transient.class) != null)
  						continue;
  					// skip serialVersionUID
  					if ("serialVersionUID".equals(field.getName()))
  						continue;
  					field.setAccessible(true);
  					fieldCallBack.doForField(field);
  				} 
  			} catch (IllegalArgumentException e) {
  				throw new RuntimeException(e);
  			} catch (IllegalAccessException e) {
  				throw new RuntimeException(e);
  			}
  			
  			if (clazz.getName().equals(DataObject.class.getName()))
  				break;
  			
  			clazz = clazz.getSuperclass();
  		}
  	}
docs: fieldCallBack.doForField() for each field in each class