#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; { package My; use Moose; has a1 => ( is => 'rw', trigger => \&a1_changed, predicate => 'has_attr' ); has a2 => ( is => 'rw', trigger => sub { $_[0]->a2_changed(@_[ 1 .. $#_ ]) } ); sub a1_changed { print ref shift, ": a1 changed.\n"; } sub a2_changed { print ref shift, ": a2 changed.\n"; } __PACKAGE__->meta->make_immutable; no Moose; } { package My::Child; use Moose; extends 'My'; has '+a1' => ( trigger => \&a1_changed ); sub a1_changed { print "Trigger 1 wrapped.\n"; $_[0]->SUPER::a1_changed; }; around a2_changed => sub { print "Trigger 2 wrapped\n"; $_[0]->(@_[ 1 .. $#_ ]); }; around has_attr => sub { print "Predicate wrapped\n"; }; __PACKAGE__->meta->make_immutable; no Moose; } my $o = 'My'->new; my $ch = 'My::Child'->new; $o->a1(2); $ch->a1(2); say $o->has_attr; say $ch->has_attr; $o->a2(3); $ch->a2(3);