supports the but method
move to storing properties as value returning functions
throws clear error when required property value not set
no mutation of state
all property fields final
makes defensive call to but in constructor
remove string duplication
minor cleanup