Re^6: Function name in a variable, can't recall the concept (introspection with ->can )
by AnomalousMonk (Archbishop) on Apr 16, 2019 at 22:22 UTC
|
| [reply] [d/l] [select] |
|
Actually I don't understand the discussion anymore, if the OP was willing to inspect a class the natural solution would be ->can.
If he wasn't inspecting a class ->can would do the job, too.
Are there pathological cases where an approach might break?
Of course, this is Perl, with high flexibility to bend internals.
| [reply] |
|
No, that's not true.
If they're trying to resolve a method, then ->can is correct.
If they're trying to resolve a sub, then ->can can fail
The OP is looking for a sub.
| [reply] [d/l] [select] |
Re^6: Function name in a variable, can't recall the concept (introspection with ->can )
by ikegami (Patriarch) on Apr 19, 2019 at 08:53 UTC
|
my $sub =
@{ get_array_by_name($pkg, 'ISA') }
? get_sub_by_name($pkg, $name)
: $pkg->can($name);
instead of
my $sub = get_sub_by_name($pkg, $name);
That's ludicrous.
| [reply] [d/l] [select] |
|
> get_sub_by_name
which get_sub_by_name?
| [reply] |
|
He probably means something hypothetical...
I was actually thinking about this seriously, and I would likely do something as:
sub get_sub_by_name {
my ($pkg, $name) = @_ ;
no strict 'refs' ;
if ( exists ${$pkg . '::'}{$name} ) {
if ( ref ${$pkg . '::'}{$name} eq 'CODE' ) {
return *{$pkg . '::' . $name} ;
}
} ;
}
Maybe it can be written more pretty, and I don't know if any odd-cases are trapped (e.g. what about __ANON__)
edit: Comes to think of it, maybe the line 'exists' is not even needed? | [reply] [d/l] |
|
|
|
|
| [reply] [d/l] |
|
|
|
|
| [reply] [d/l] |
|
| [reply] |
|