Note: this class has a natural ordering that is inconsistent with equals