————package
Module::Loaded;
use
strict;
$VERSION
=
'0.08'
;
@EXPORT
=
qw[mark_as_loaded mark_as_unloaded is_loaded]
;
}
=head1 NAME
Module::Loaded - mark modules as loaded or unloaded
=head1 SYNOPSIS
use Module::Loaded;
$bool = mark_as_loaded('Foo'); # Foo.pm is now marked as loaded
$loc = is_loaded('Foo'); # location of Foo.pm set to the
# loaders location
eval "require 'Foo'"; # is now a no-op
$bool = mark_as_unloaded('Foo'); # Foo.pm no longer marked as loaded
eval "require 'Foo'"; # Will try to find Foo.pm in @INC
=head1 DESCRIPTION
When testing applications, often you find yourself needing to provide
functionality in your test environment that would usually be provided
by external modules. Rather than munging the C<%INC> by hand to mark
these external modules as loaded, so they are not attempted to be loaded
by perl, this module offers you a very simple way to mark modules as
loaded and/or unloaded.
=head1 FUNCTIONS
=head2 $bool = mark_as_loaded( PACKAGE );
Marks the package as loaded to perl. C<PACKAGE> can be a bareword or
string.
If the module is already loaded, C<mark_as_loaded> will carp about
this and tell you from where the C<PACKAGE> has been loaded already.
=cut
sub
mark_as_loaded (*) {
my
$pm
=
shift
;
my
$file
= __PACKAGE__->_pm_to_file(
$pm
) or
return
;
my
$who
= [
caller
]->[1];
my
$where
= is_loaded(
$pm
);
if
(
defined
$where
) {
carp
"'$pm' already marked as loaded ('$where')"
;
}
else
{
$INC
{
$file
} =
$who
;
}
return
1;
}
=head2 $bool = mark_as_unloaded( PACKAGE );
Marks the package as unloaded to perl, which is the exact opposite
of C<mark_as_loaded>. C<PACKAGE> can be a bareword or string.
If the module is already unloaded, C<mark_as_unloaded> will carp about
this and tell you the C<PACKAGE> has been unloaded already.
=cut
sub
mark_as_unloaded (*) {
my
$pm
=
shift
;
my
$file
= __PACKAGE__->_pm_to_file(
$pm
) or
return
;
unless
(
defined
is_loaded(
$pm
) ) {
carp
"'$pm' already marked as unloaded"
;
}
else
{
delete
$INC
{
$file
};
}
return
1;
}
=head2 $loc = is_loaded( PACKAGE );
C<is_loaded> tells you if C<PACKAGE> has been marked as loaded yet.
C<PACKAGE> can be a bareword or string.
It returns falls if C<PACKAGE> has not been loaded yet and the location
from where it is said to be loaded on success.
=cut
sub
is_loaded (*) {
my
$pm
=
shift
;
my
$file
= __PACKAGE__->_pm_to_file(
$pm
) or
return
;
return
$INC
{
$file
}
if
exists
$INC
{
$file
};
return
;
}
sub
_pm_to_file {
my
$pkg
=
shift
;
my
$pm
=
shift
or
return
;
my
$file
=
join
'/'
,
split
'::'
,
$pm
;
$file
.=
'.pm'
;
return
$file
;
}
=head1 BUG REPORTS
Please report bugs or other issues to E<lt>bug-module-loaded@rt.cpan.org<gt>.
=head1 AUTHOR
This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
=head1 COPYRIGHT
This library is free software; you may redistribute and/or modify it
under the same terms as Perl itself.
=cut
# Local variables:
# c-indentation-style: bsd
# c-basic-offset: 4
# indent-tabs-mode: nil
# End:
# vim: expandtab shiftwidth=4:
1;