sub doit { my( $self, $a, $b ) = @_; $self->{thing} += $a; $self->{thing} *= $b; } #### sub doit { my( $self, $a, $b ) = @_; $self->_validate_self( __PACKAGE__ ); $self->{validators}{'doit_a'}->( $a ); $self->{validators}{'doit_b'}->( $b ); $self->{befores}{'doit'}->( $self, $a, $b ); my( @results ) = $self->{arounds}{'doit'}->( $self->{setters}{doit}, $self, $a, $b ); $self->{afters}{'doit'}->( $self, $a, $b ); return @results; } #### sub doit { my( $self, $a, $b ) = @_; die unless $self =~ __PACKAGE__ and look_likenumber( $a ) and looks_like_number( $b ); ## do some stuff before $self->{thing} += $a; $self->{thing} *= $b; ## do some stuff after return $self->{thing}; } #### package Parent; use Moose; sub rant { printf " RANTING!\n" } before 'rant' => sub { printf " In %s before\n", __PACKAGE__ }; after 'rant' => sub { printf " In %s after\n", __PACKAGE__ }; around 'rant' => sub { my $orig = shift; my $self = shift; printf " In %s around before calling original\n", __PACKAGE__; $self->$orig; printf " In %s around after calling original\n", __PACKAGE__; }; 1; package Child; use Moose; extends 'Parent'; before 'rant' => sub { printf "In %s before\n", __PACKAGE__ }; after 'rant' => sub { printf "In %s after\n", __PACKAGE__ }; around 'rant' => sub { my $orig = shift; my $self = shift; printf " In %s around before calling original\n", __PACKAGE__; $self->$orig; printf " In %s around after calling original\n", __PACKAGE__; }; 1; In Child before In Child around before calling original In Parent before In Parent around before calling original RANTING! In Parent around after calling original In Parent after In Child around after calling original In Child after