sub foo { log_msg("In subroutine foo") if $DEBUG } #### package Foo; use strict; use warnings; use Attribute::Handlers; sub _log : ATTR(CODE) { my ($package, $symbol) = @_; { no strict 'refs'; no warnings 'redefine'; my $name = *{ $symbol }{NAME}; my $code = \&{ $package . '::' . $name }; *{ $package . '::' . $name } = sub { my $self = shift; print "Entering sub $name\n"; $code->( $self, @_ ); }; } } sub foo : _log { my $self = shift; print "in foo\n"; } 1; #### Entering sub foo in foo #### sub rm_secret_stuff : _authz(admin) { ... }