Module::Util::Masked - mangle Module::Util to recognise module masking
perl -MModule::Util::Masked \ -MTest::Without::Module=Some::Thing \ myprog.pl ... perl -MModule::Util::Masked \ -MModule::Mask::Deps \ myprog.pl ... # or within a script use Module::Util::Masked; use Module::Mask; my $mask = Module::Mask->new ('Some::Thing');
This module mangles Module::Util functions
find_installed() all_installed() find_in_namespace()
to have them not return modules which are "masked" by any of
Module::Mask Module::Mask::Deps Test::Without::Module Devel::Unplug
This is meant for testing, just as these masking modules are meant for testing, to pretend some modules are not available. Making the "find" functions in Module::Util reflect the masking helps code which checks module availability by a find rather than just eval{require...} or similar.
Module::Util
eval{require...}
Module::Util::Masked should be loaded before anything which might import the Module::Util functions, so such an import gets the mangled functions not the originals.
Module::Util::Masked
Usually this means loading Module::Util::Masked first, or early enough, but there's no attempt to detect or enforce that. A -M on the command line is good
-M
perl -MModule::Util::Masked myprog.pl ...
Or for the ExtUtils::MakeMaker testing harness the same in the usual HARNESS_PERL_SWITCHES environment variable,
ExtUtils::MakeMaker
HARNESS_PERL_SWITCHES
HARNESS_PERL_SWITCHES="-MModule::Util::Masked" make test
Otherwise somewhere near the start of a script
use Module::Util::Masked;
Nothing actually changes in the Module::Util behaviour until one of the above mask modules such as Test::Without::Module is loaded and is asked to mask some modules. Then the mangled Module::Util will report such modules not found.
Test::Without::Module
The mangling cannot be undone, but usually there's no need to. If some modules should be made visible again then ask the masking in Test::Without::Module etc to unmask them.
Module::Mask is recognised by the object it adds to @INC.
Module::Mask
@INC
Module::Mask::Deps is a subclass of Module::Mask and is recognised the same way.
Module::Mask::Deps
Test::Without::Module is recognised by the fake_module() coderef it adds to @INC (which is not documented as such, so is dependent on the Test::Without::Module implementation).
fake_module()
The masking object or coderef in @INC is applied at the point it appears in the @INC list. This means any directory in @INC before the mask is unaffected, the same way it's unaffected for a require etc. The masking modules normally put themselves at the start of @INC and are therefore usually meant to act on everything.
require
Devel::Unplug is checked by its unplugged() list, when that function exists. It applies to any require so not to a particular place in @INC. Should an unplug be enforced when find_installed() etc is given a path, or only the default @INC? If a path is @INC plus or minus a few directories and then unplugging would be desirable, but if it's something unrelated then maybe not.
Devel::Unplug
unplugged()
find_installed()
Module::Util, Module::Mask, Module::Mask::Deps, Test::Without::Module, Devel::Unplug
http://user42.tuxfamily.org/test-variousbits/index.html
Copyright 2010, 2011, 2012, 2015, 2017 Kevin Ryde
Test-VariousBits is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.
Test-VariousBits is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with Test-VariousBits. If not, see http://www.gnu.org/licenses/.
To install Test::VariousBits, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Test::VariousBits
CPAN shell
perl -MCPAN -e shell install Test::VariousBits
For more information on module installation, please visit the detailed CPAN module installation guide.