Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

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 ( [id://1232798]=note: print w/replies, xml ) Need Help??


in reply to Re^5: Function name in a variable, can't recall the concept (introspection with ->can )
in thread Function name in a variable, can't recall the concept

So it is as I said. You're suggesting that we use

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.

  • Comment on Re^6: Function name in a variable, can't recall the concept (introspection with ->can )
  • Select or Download Code

Replies are listed 'Best First'.
Re^7: Function name in a variable, can't recall the concept (introspection with ->can )
by LanX (Saint) on Apr 19, 2019 at 12:41 UTC
    > get_sub_by_name

    which get_sub_by_name?

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

      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?

        I'm afraid your hypothetical code for his hypothetical function is ignoring how typeglobs work.

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

      Some code that gets a reference to the sub by name. What that code is doesn't matter, though it could be as simple as \&{ $pkg . '::' . $name }.

        > could be as simple as \&{ $pkg . :: . $name }.

        nope, this will autovivify a missing function glob $name and return a broken coderef.

        try again.

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Re^7: Function name in a variable, can't recall the concept (introspection with ->can )
by LanX (Saint) on Apr 20, 2019 at 18:21 UTC
    > You're suggesting that we use

    >  my $sub = @{ get_array_by_name($pkg, 'ISA') } ? get_sub_by_name($pkg, $name) : $pkg->can($name);

    No, I don't!

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

      uh, then feel free to clarify why you meant by "one can easily check @ISA".

        I already explained.

        But feel free to describe a use case where one might be interested to only call the non-inherited methods of a class, and this without prior knowledge about its OOP nature.

        In this light try to read again the OP which uses it's own well known package like a "dispatch" table for ordinary functions.

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1232798]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others studying the Monastery: (2)
As of 2024-04-26 01:33 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found