private List<String> getProperties(Class<?> clazz) {
		List<String> properties = new ArrayList<String>();

		Iterable<Field> fields = filter(
				Arrays.asList(clazz.getDeclaredFields()),
				new Predicate<Field>() {
					@Override
					public boolean apply(Field input) {
						return !Modifier.isStatic(input.getModifiers());
					}
				});

		for (Field f : fields) {
			String name = f.getName();
			Object value = null;

			try {
				value = f.get(this);
			} catch (IllegalArgumentException e) {
				value = "unable to get value: " + e;
			} catch (IllegalAccessException e) {
				value = "unable to get value: " + e;
			} finally {
				properties.add(name + ": " + value);
			}
		}

		Class<?> superclass = clazz.getSuperclass();
		if (superclass != null) {
			properties.addAll(getProperties(superclass));
		}

		return properties;
	}