On 4/29/12, Jacob Carlborg <d...@me.com> wrote: > In principle I agree with you. But in practice this doesn't always work. > Take this for example: > Prints "0" and "1" as expected. If we now change "point" to a property > like this: > It will now print "0" and "0". This is a silently breaking change. Sure > you can change "point" to return by reference..
This is a great point and an issue I've ran into and talked about before. The compiler really ought to try and convert a call like this: foo.property++; foo.property+=10; into e.g.: foo.property = foo.property.opAdd(1); foo.property = foo.property.opAdd(10); It would make for some really nice APIs if this feature was available. Otherwise I have to resort to template magic and delegate calls such as: class Widget { Notify!Point pos; this() { pos.init(&posSet); } // if pos changes, invoke posChange void posChange(ref Point newPos) { newPos.normalize(); } // e.g. if out of bounds } Unfortunately that template broke in an earlier compiler regression that I haven't noticed until recently (http://d.puremagic.com/issues/show_bug.cgi?id=7991)