use Attribute::Handlers; use constant RETRY_LIMIT => 4; use constant RETRY_DELAY => 2; sub verify_am_i_doing_good : __retry { return 1 if ($x == $y); return; } sub __retry : ATTR(CODE) { my ($pkg, $sym, $code) = @_; my $name = *{ $sym }{NAME}; no warnings 'redefine'; *{ $sym } = sub { my $self = $_[0]; my $result; logMsg (INFO, "Executing subroutine $name with retry limit " . RETRY_LIMIT); for (my $retryCount = 1; $retryCount <= RETRY_LIMIT; $retryCount++) { logMsg (INFO, "Executing subroutine $name with retry count $retryCount"); my $result = $code->( @_ ); if ($result) { logMsg (INFO, "Expected result observed in retry count $retryCount"); return wantarray ? @$result : $result; } else { logMsg (INFO, "Expected result is NOT observed in retry count $retryCount"); logMsg (INFO, "Retrying again by updating uixml"); sleep RETRY_DELAY; $self->updateState(); } } logMsg (WARN, "Failed to verify expected result for subroutine $name with retry limit " . RETRY_LIMIT); return; }; }