# New Ticket Created by David Warring
# Please include the string: [perl #129907]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/Ticket/Display.html?id=129907 >
I'm adding a FALLBACK method to create method dynamically, the it receives
both '.' and '.?' invocations, and I can't distinguish between them.
This then breaks $obj.unknown vs $obj.?unknown handling in class objects.
Consider:
use Test;
class C {
method foo { 42 }
method FALLBACK($meth-name, |c) {
warn "can $meth-name";
if $meth-name eq 'bar' {
self.^add_method($meth-name, method { 69 });
self."$meth-name"(|c);
}
else {
warn "dunno if this is a safe method call or not";
Nil;
}
}
}
for C {
my $obj = .new;
is $obj.foo, 42, 'static method - direct call';
is $obj.?foo, 42, 'static method - safe call';
is $obj.bar, 69, 'dynamic method - direct call';
is $obj.?bar, 69, 'dynamic method - safe call';
todo "can't get both of these to pass!";
dies-ok {$obj.unknown}, 'direct call - unknown method dies';
lives-ok {$obj.?unknown}, 'safe call - unknown method lives';
}
I'm receiving both the safe and unsafe 'unknown' invocations, and can't
distinguish them.
I also tried overriding the classes 'can' method:
class C {
method foo { 42 }
method can($meth-name) {
my $meths = callsame;
if !$meths && $meth-name eq 'bar' {
$meths = [method { 69 }, ];
self.^add_method($meth-name, $meths[0]);
}
$meths;
}
method FALLBACK($meth-name, |c) {
if self.can($meth-name) {
self."$meth-name"(|c);
}
else {
warn "dunno if this is a safe method call or not";
Nil;
}
}
}
But the FALLBACK is still needed, and still has the same problem.
Any ideas?