Is there a reason you didn't make `Constraint` an interface? It just seems like it would be simpler to create new constraints if it were done that way.