http://www.perlmonks.org?node_id=669853


in reply to Re: announce missing modules
in thread announce missing modules

That's a great idea. I started to play with something similar and got the following for the anon function on the @INC array.
BEGIN { use 5.8.0; use vars qw(@missing); push @INC, sub { my ($coderef, $filename) = @_; # Ignore non-modules. return undef unless ($filename =~ s/.pm$//); # Remember the module. $filename =~ s/\//::/g; push @missing, $filename; # Return a dummy file handle. open my $FH, '<', \'1;'; $FH; }; }
The INIT block is a great idea.
INIT { # Check and clean up. die "Missing modules.\n\tcpan -i ", join(' ',' @missing), "\n\ +n" if (@missing); pop @INC; }
The open my $FH, '<', \'1;'; is available in perl 5.8.8.

Is there a better way to deduce the module name than removing the .pm extension and replacing /s with ::? Will it work on non-UNIX platforms?

Popping the function off again seems like a good idea.

Replies are listed 'Best First'.
Re^3: announce missing modules
by Arif (Acolyte) on Feb 26, 2008 at 14:44 UTC
    Just for the record, I found the flaw in this scheme. One of my included modules includes 'Storable', which tries to include 'Log::Agent'. If it fails then the 'Storable' module does something else. The above @INC scheme forces the user to install the conditional module. This shouldn't happen.

    So back to the old method (slightly refined to handle module versions and import lists)

    { our @missing = map +(m/^(\S+)/), grep !eval "use $_; 1", grep $_, split /\s*\n\s*/, " Storable File::Basename A::B wq(a b c) Foo::Bar CGI qw/:standard/ " and die "Please install CPAN modules: cpan -i @missing\n"; }