The trigger gets fired whenever a value is explicitly set for an attribute, but not when it's implicitly set by a default/builder. Basically, it's triggered by the outside world setting a value, but not triggered by the internal workings of the attribute. The default/builder is itself a coderef though, so can execute arbitrary code, including doing whatever the trigger would do.
I don't think this violates the principle of least surprise if you consider the usual definition of "trigger". A trigger is a device that responds when it is pressed. You press the trigger on an attribute by supplying a value for it. If you don't supply a value for it, then the trigger doesn't get pressed.
In any case, Moose has had this behaviour for triggers since they were introduced in 2006, and changing it would break a lot of stuff.
In reply to Re^5: Types::DateTime, DateTimeUTC->plus_coercions( Format['ISO8601'] ), output format override question
by tobyink
in thread Types::DateTime, DateTimeUTC->plus_coercions( Format['ISO8601'] ), output format override question
by Your Mother
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |