Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Find out who redefined a subroutine

by Dallaylaen (Friar)
on Jan 25, 2013 at 15:18 UTC ( #1015363=perlmeditation: print w/replies, xml ) Need Help??

I've been asked recently how to tell which perl module overrides a function. Here's an exapmle I managed to write. It's incomplete and most certainly buggy, but I don't think the task in question is worth a full-blown CPAN module anyway.
#!/usr/bin/perl -w

use strict;

BEGIN {
use Guard;
use Carp;
{
  my $guard = guard { Carp::cluck "Function replaced!" };
  my $code = \&time;
  *time = sub { return $code->(@_); undef $guard; };
};
};

BEGIN { print time(), "\n"; };

use Time::HiRes qw(time);

print time, "\n";
I welcome critique on this one.

Replies are listed 'Best First'.
Re: Find out who redefined a subroutine
by tobyink (Abbot) on Jan 25, 2013 at 15:33 UTC

    Ta da!

    sub sub::source { require Sub::Identify; my ($class, $func) = @_; my $code = $class->can($func) or return; return Sub::Identify::stash_name($code); } { package MyApp; use Time::HiRes qw(time); use Carp; } # Where do MyApp's subs come from? # print MyApp->sub::source('carp'), "\n"; print MyApp->sub::source('time'), "\n"; # Where do Carp's subs come from? # print Carp->sub::source('carp'), "\n"; print Carp->sub::source('import'), "\n";

    Though it's worth noting that Sub::Name is able to fool Sub::Identify. Also, Moose/Moo/etc do stringy eval stuff that fools Sub::Identify (deliberately).

    package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name
      Aha, so there *is* a full-blown CPAN module for this. Thanks for noting!

      My code can be fooled, too.

      Just copy original subref to a private variable and it would think the sub is still the original one.

        Maybe a way to prevent being fooled is to MD5 the sub, and sign it.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlmeditation [id://1015363]
Front-paged by Arunbear
help
Chatterbox?
[ambrus]: nysus: make sure you enter at least two lines for the title and then preview, and read warnings the preview form prints
[davies]: There is an option (I have it set) to force preview before submission. Perhaps your option has been set (accidentally?) and you are not expecting it.
[ambrus]: sorry, I mean at least two words for the title and then preview
[ambrus]: davies: that option is the default. and it's not really "force", it just hides the button.
[marto]: yes, not reading the errors displayed has been a cause of this type of report in the past
[nysus]: Ambrus, ah. I think that was the problem. I'll try. Thanks!
[davies]: Ambrus: you've missed it by a couple of weeks, but consider next year's London Perl Workshop.

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (7)
As of 2017-12-15 11:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    What programming language do you hate the most?




















    Results (431 votes). Check out past polls.

    Notices?