You can do:

has 'attrib'     => (is => 'rw', trigger => sub { my $self = shift;
$self->attrib_changed } );

On Wed, Mar 28, 2018 at 6:46 PM, Robert Freimuth via moose <moose@perl.org>
wrote:

> I've been learning Moose and I came across unexpected behavior: method
> modifiers (such as 'after') do not seem to work with attribute triggers.
> This is an issue because I want a subclass to extend a method that is
> defined as a trigger in the parent. The issue and one workaround is shown
> below.
>
> use strict;
> use warnings;
>
> package Foo;
>
> use Moose;
>
> has 'attrib' => ( is => 'rw', trigger => \&attrib_changed );
> has 'workaround' => ( is => 'rw', trigger => \&workaround_changed );
>
> sub attrib_changed
> {
>     print "  in attrib_changed\n"; # called
> }
>
> after 'attrib_changed' => sub
> {
>     print "    in 'after' attrib_changed\n"; # not called
> };
>
> sub workaround_changed
> {
>     my ( $self ) = @_;
>     print "  in workaround_changed\n"; # called
>     $self->not_a_trigger;
> }
>
> after 'workaround_changed' => sub
> {
>     print "    in 'after' workaround_changed\n"; # not called
> };
>
> sub not_a_trigger
> {
>     print "  in not_a_trigger\n"; # called
> }
>
> after 'not_a_trigger' => sub
> {
>     print "    in 'after' not_a_trigger\n"; # called
> };
>
> my $foo = Foo->new;
>
> print "Calling attrib( 1 ):\n";
> $foo->attrib( 1 );
>
> print "Calling workaround( 1 ):\n";
> $foo->workaround( 1 );
>
>
> Output:
>
> Calling attrib( 1 ):
>   in attrib_changed
> Calling workaround( 1 ):
>   in workaround_changed
>   in not_a_trigger
>     in 'after' not_a_trigger
>
> I could not find anything in the Moose docs or online that documents this
> behavior as a known limitation. I'd be surprised if I were the first one to
> notice it, so it makes me wonder whether I am trying to do something that
> is best done some other way. Thoughts?
>
>
>

Reply via email to