Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: How to see what is available in Module::Namespace::*

by Joost (Canon)
on Sep 21, 2009 at 18:42 UTC ( #796591=note: print w/ replies, xml ) Need Help??


in reply to How to see what is available in Module::Namespace::*

So, basically, to load every available module matching /MyModule::Plugins::\w+/ you can do:

for (@INC) { my $path = "$_/MyModule/Plugins"; for my $m (<$path/*.pm>) { $m =~ s{^\Q$_\E/}{}; # strip off everything leading up to MyModul +e... $m =~ s{/}{::}g; # replace / with :: $m =~ s{\.pm$}{}; # remove extension eval "use $m;"; # use MyModule::Plugin::Whatever die if $@; # propagate exceptions } }
updated: fixed glob


Comment on Re: How to see what is available in Module::Namespace::*
Download Code
Re^2: How to see what is available in Module::Namespace::*
by ikegami (Pope) on Sep 21, 2009 at 19:45 UTC

    That only searches one of @INC's directories, and it has portability issues. Fix:

    use Path::Class qw( dir ); use Scalar::Util qw( reftype ); my $base_pkg = __PACKAGE__ . '::Plugins'; my %plugins; my @subdirs = split(/::/, $base_pkg); for (@INC) { next if reftype($_); ++$plugins{"{$base_pkg}::$_"} for grep /^\.pm\z/, map $_->basename(), grep !$_->is_dir(), dir($_, @subdirs)->children(); } ( my $base_dir = $base_pkg ) =~ s{::}{/}g; ++$plugins{"{$base_pkg}::$_"} for map m{^\Q$base_dir\E/([^/]+)\.pm\z}, keys(%INC); my @plugins = sort keys(%plugins); # Load them all! for my $plugin (@plugins) { eval("require \E$plugin\Q") or die("Loading plugin $plugin: $@"); }

    You gotta be careful that the file name case matches the package name case on case-agnostic systems. You've got a problem if there's a caseless system out there. Maybe some heuristics would help (such as scanning the .pm for a matching package statement and use its case).

    Scanning %INC is useful for getting around the problem of a package manager creating a virtual file system using a reference in @INC.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (7)
As of 2015-07-04 19:57 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (60 votes), past polls