public boolean equals(EqualsData otherData) {
		//TODO: support inheritance.. maybe?

		// check for obvious incompatibility
		if (otherData == null) return false;
		DataObject otherObject = otherData.dataObject;
		if (this.dataObject == otherObject) return true;
		if (this.dataObject == null || otherObject == null) return false;
		if (this.dataObject.getClass() != otherObject.getClass()) return false;

		// by definition, if the hashcodes aren't equal, nor are the fields 
		if (otherObject.hashCode() != dataObject.hashCode()) return false;

		// The process works by having our DataObject
		// add each of its fields. After every one,
		// we have the other DataObject add its fields
		// but we only store the one that matches the field
		// out DataObject just added. Then we compare them and repeat
		// until we find an inequality or all the fields have been added.

		equalSoFar = true;
		inLeftEquals = true;
		compareTo = otherData;
		desiredFieldIndex = -1;
		fieldIndex = 0;
		try {
			addFields(dataObject);
		} catch (Exception e) {
			error("Error adding fields", e);
		}
		inLeftEquals = false;
		return equalSoFar;
	}