开发者

How do I figure out what module is loading Moose?

I am trying to figure out which module in my CGI::Application is loading Moose. I attempted to overload "require" but I don't seem to have the syntax quite right. If someone could clean up the following code I would appreciate it:

use strict;
use warnings;
use Carp qw//;

BEGIN {
  *CORE::GLOBAL::require = sub (*) { 
    warn "Requiring $_[0] at: " . Carp::longmess();
    CORE::require (@_);
  };
}

Basically, the problem with this script is that it isn't actually开发者_高级运维 loading anything. When CORE::require(@) is called is doesn't "do" anything. I tried just passing it the script name directly using $[0], but that just resulted in the script deadlocking until it timed out.

NOTE: The above script is at the beginning of my start up script


Hows about:

BEGIN {
  unshift @INC, sub {
    printf "Moose first called by pkg %s at line %d in %s\n", (caller)[0,2,1]
      if $_[1] eq 'Moose.pm';
  };
}

This "works" because subroutine references in @INC are called and passed the coderef and filename as arguments. See require perldoc:

As mentioned by phaylon, you can also use Devel::TraceLoad to get a summary of all modules loaded while your application ran (and what line of what file loaded them) with

perl -MDevel::TraceLoad=summary my_progam.pl


You can find out who is loading a particular module, by inserting a few lines at the start of the module to get the "caller". Find Moose.pm in your library tree (perl -mMoose -wle'print $INC{"Moose.pm"}', and edit it to:

package Moose;

use Data::Dumper;
warn "!!! Moose is being loaded by: ", Dumper([caller]);

This is quick and dirty, but it sounds like it's all you need. (Don't forget to unedit the changes to Moose.pm when you are done!)


In *Nix:

mkdir dummy
echo > dummy/Moose.pm
perl -I./dummy /path/to/my_script.pl

The concept would be the same in Windows.

You should get:

Moose.pm did not return a true value at ...
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜