Constraints enable the definition of limitations on property values such
as NotNull etc. The constraints are implemented in two stages: custom and
declerative. There are a set of "well known" constraints such as not
null and number ranges, however constraints can be pluggable as well.
The default behavior on constraint failure is to silently ignore such
a failure, however this default can be overriden.