I have this code:
package Foo;
use Moo;
has attr => ( is => "rw", trigger => 1 );
sub _trigger_attr
{ print "trigger! value:". shift->attr ."\n" }
package main;
use Foo;
my $foo = Foo->new( attr => 1 );
$foo->attr( 2 );
It returns:
$ perl test.pl
trigger! value:1
trigger! value:2
This is default, documented behavior of Triggers in Moo.
How can I disable trigger execution if the attribute is set via constructor?
Of course I can do it like this:
package Foo;
use Moo;
has attr => ( is => "rw", trigger => 1 );
has useTriggers => ( is => "rw", default => 0 );
sub _trigger_attr
{
my $self = shift;
print "trigger! value:". $self->attr ."\n" if $self->useTriggers
}
package main;
use Foo;
my $foo = Foo->new( attr => 1 );
$foo->useTriggers( 1 );
$foo->attr( 2 );
And get:
$ perl testt.pl
trigger! value:2
So it works, but ... it feels wrong ;).
I don't know much about
Moo, but inMooseyou can implement your own code after the constructor. If you can do something like this inMooit would give you the desired effect.This would cause
useTriggersto be set just after construction so the trigger would be active after the object is constructed, but not before it is constructed.So you should be able to write:
And get the same output.