diff --git a/revbank b/revbank index 7238c08..5d20f0c 100755 --- a/revbank +++ b/revbank @@ -6,6 +6,7 @@ use experimental 'isa'; # stable since v5.36 use experimental 'signatures'; # stable since v5.36 use List::Util qw(uniq); +use Sub::Util qw(subname); use POSIX qw(ttyname); use FindBin qw($RealBin); @@ -167,6 +168,11 @@ OUTER: for (;;) { "unexpected trailing input (use ';' to separate transactions)." ); + my $coderef = ref($method) ? $method : $plugin->can($method); + my ($mname) = $coderef + ? (subname($coderef) eq "__ANON__" ? "" : subname($coderef) . ": ") + : (ref($method) ? "" : "$method: "); + my ($rv, @rvargs) = ($word =~ /[^\x20-\x7f]/ and $method eq 'command' || !$plugin->AllChars($method)) @@ -183,11 +189,12 @@ OUTER: for (;;) { $retry = $@->reason; redo OUTER; } elsif ($@) { - call_hooks "plugin_fail", $plugin->id, "$method: $@"; + call_hooks "plugin_fail", $plugin->id, "$mname$@"; abort; } + if (not defined $rv) { - call_hooks "plugin_fail", $plugin->id, "$method: No return code"; + call_hooks "plugin_fail", $plugin->id, $mname . "No return code"; abort; } if (not ref $rv) { @@ -204,8 +211,10 @@ OUTER: for (;;) { $prompt = $rv; @plugins = $plugin; ($method) = @rvargs; - call_hooks "plugin_fail", $plugin->id, "$method: No method supplied" - if not ref $method; + if (not ref $method) { + call_hooks "plugin_fail", $plugin->id, $mname . "No method supplied"; + abort; + } next WORD; } @@ -247,11 +256,11 @@ OUTER: for (;;) { } if ($rv == NEXT) { next PLUGIN if $method eq 'command'; - call_hooks "plugin_fail", $plugin->id, "$method: " + call_hooks "plugin_fail", $plugin->id, $mname . "Only 'command' should ever return NEXT."; abort; } - call_hooks "plugin_fail", $plugin->id, "$method: Invalid return value"; + call_hooks "plugin_fail", $plugin->id, $mname . "Invalid return value"; abort; } call_hooks "invalid_input", $cart, $origword, $word, \@allwords;