You might be interested in
Attribute::Handlers as a way of installing handlers base on subroutine attributes:
#!/usr/bin/perl
use warnings; use strict;
use Attribute::Handlers;
sub log : ATTR(CODE) {
my ($pkg, $sym, $code) = @_;
no strict 'refs';
no warnings 'redefine';
#
# Install log handler
#
my $name = *{ $sym }{NAME};
warn "installing log handler for $pkg\:\:$name";
*{$pkg . '::' . $name} = sub {
warn "BEGIN sub block...$pkg\:\:$name\n";
my @rv = $code->(@_);
warn "END sub block...$pkg\:\:$name\n\n";
return @rv;
}
}
sub something : log {
print "I'm doing something with @_.\n";
return 42;
}
my ($result) = something(qw/foo bar/);
print "result: $result\n";
This produces:
installing log handler for main::something at log.pl line 13.
BEGIN sub block...main::something
I'm doing something with foo bar.
END sub block...main::something
result: 42
Update: Added
no warnings 'redefine';