let modification methods return self, so they can be chained together without using a variable
use copy-on-write, so obj.transform() leaves obj untouched, but returns a transformed copy of itself, so a=...; b=a.mod1(); c=a.mod2() works as expected