Chris Prather wrote: > On Fri, Oct 5, 2012 at 10:54 AM, Dave Howorth > <dhowo...@mrc-lmb.cam.ac.uk> wrote: >> Jeff Hallock wrote: >>> Hi Dave, >>> >>> 'after' is called after a method call. >>> >>> If you want a block of code to be called every time you set an attribute, >>> you want to use a trigger: >>> >>> has 'foo' => ( >>> is => 'rw', >>> trigger => sub { >>> # will be called when setting the attribute via 'new' or via >>> the writer method >>> my ( $self, $newval, $oldval ) = @_; >>> ... >>> } >>> ); >> That's great. My code works now. Thanks Jeff. >> >> It does seem counter-intuitive. I'd expect >> >> $o = Class->new(attribute => 'value'); >> >> to have the same effect as >> >> $o = Class->new(); $o->attribute('value'); >> >> Anyway, at least it works and hopefully I'll remember the exception for >> next time. > > I actually wouldn't, at least not anymore.
I'm afraid I don't understand what it is you wouldn't, given that it seems you would have before but won't now? > Behavior and state while related are distinct. The call to new() is > passing in the new state for the object that is about to be created, I > wouldn't expect any extra behavior to fire there, and if it did I > would want it to happen explicitly (say via $self->attribute('value') > in BUILD method ... or via a trigger). The call to new is passing in a new value for an attribute. The call to the mutator is passing in a new value for an attribute. I expect them to treat the new value in the same way in both cases. > I can understand why you would have the expectations you have. I can > also understand why I have the expectations I have. I don't understand why you have the expectations you have. I'm not even sure I understand what those expectations are. Is there any documentation that explain what expectations are sensible to have for Moose? (one thing I've noticed is that the documents start out by giving basic explanations of how to construct objects, and then more complicated explanations of what can be constructed, without giving any examples at all of how to use the objects.) > Typically (though > arguably not always) with Moose the defaults should be set to the > least intrusive / most explicit possible. Since there is no way to > unfire an accessor method during construction, the default has to be > to make that behavior explicit. I'm not clear what defaults have to do with it? Nor what would constitute unfiring an accessor? Or why you would want to do it? Confused, Dave