private static Map<String, Prop> getProperties(Class c1) {
		Map<String, Prop> propsMap = new HashMap<String, Prop>();
		Field[] fields = c1.getDeclaredFields();
		for (Field f : fields) {
			f.setAccessible(true);  // bye-bye "private"
			String fieldName = f.getName();
			
			// Put the entry in the props map,
			// unless we already put it b/c of a method
			Prop p = propsMap.get(fieldName);
			if (p == null) {
				p = new Prop(fieldName);
				propsMap.put(fieldName, p);
			}
			p.rawField = f;
		}
		
		Method[] methods = c1.getDeclaredMethods();
		for (Method m : methods) {
			m.setAccessible(true);  // bye-bye "private"
			String methodName = m.getName();
			if (!(methodName.startsWith("get") || methodName.startsWith("set"))) {
				continue;
			}
			String propName = methodName.substring(3);
			propName = propName.substring(0,1).toLowerCase() +
				propName.substring(1);
			// Put the entry in the props map,
			// unless we already put it b/c of f's mate.
			Prop p = propsMap.get(propName);
			if (p == null) {
				p = new Prop(propName);
				propsMap.put(propName, p);
			}
			if (methodName.startsWith("get")) {
				p.getter = m;
			} else if (methodName.startsWith("set")) {
				p.setter = m;
			} else {
				throw new IllegalStateException("invalid name " + methodName);
			}
		}
		return propsMap;
	}