A constraint can be defined on a class, an option or a getter method.
The Constraint class encapsulates all the configuration required for
validating this class, option or getter result successfully.
Constraint instances are immutable and serializable.