Search code examples
perlmoosedbix-class

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


Solution

  • 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