package FOO; use strict; use warnings; use Attribute::Handlers; use base 'Exporter'; our @EXPORT = qw(__RETRY); sub __RETRY : ATTR(CODE) { my ($pkg, $sym, $code) = @_; no warnings 'redefine'; *{ $sym } = sub { my $self = $_[0]; my $result; print ("Executing subroutine\n"); $result = $code->(); if ($result) { print "You Pass\n"; } else { print "You Fail\n"; } } } sub foo : __RETRY { print "Executing Foo\n"; return 1; } 1;