NAME
Package::Watchdog - Forbid subs in one package from accessing subs in another package, directly or otherwise.
DESCRIPTION
This package provides a function that allows you to 'watch' methods in a package to ensure they do not access methods in another package. The watch endures until the function returns meaning functions caleld by your package cannot access the forbidden package's subs either.
You can also generate warnings when access occurs as opposed to dying. But perhapse the most useful feature is a custom reaction subroutine.
SYNOPSYS
Don't let package My::Package access subs in Fake::Package (die if it tries)
add_watchdog( watch => 'My::Package', forbid => 'Fake::Package' );
Warn instead
add_watchdog( watch => 'My::Package', forbid => 'Fake::Package', warn => 1 );
Handle is a custom way
add_watchdog( watch => 'My::Package', forbid => 'Fake::Package', react => sub { ... } );
See REACT below for more details on the REACT sub.
Watch only specific subs
add_watchdog( watch => 'My::Package', forbid => 'Fake::Package', watch_subs => [ 'suba', 'subb' ] );
Forbid only specific subs
add_watchdog( watch => 'My::Package', forbid => 'Fake::Package', forbid_subs => [ 'suba', 'subb' ] );
REACT SUBS
Here is an example of a reaction that dies when the watched sub is called with no parameters, but continues as normal when the watched sub was called with a parameter.
react => sub {
my %params = @_;
if ( $params{ watch_params }->[0] ) {
return $params{ original_sub }->( @{ $params{ forbid_params }} )
}
die( 'reacted badly' );
}
%params contains the following:
{
watch => WATCHED PACKAGE NAME
watch_params => [ @_ for the watched sub ]
original_watch_sub => coderef for the original sub that was watched
watched_sub => name of the sub that was watched
forbid => FORBIDDEN PACKAGE NAME
forbid_params => [ @_ for the forbidden sub ]
original_sub => coderef for the original sub that was forbidden
forbid_sub => name of the sub that was forbidden
message => the typical watchdog die/warn message string
}
Notes and Caveats
- AUTOLOAD and similar
-
You cannot watch a sub until it exists. If the sub is an AUTOLOAD function you must AUTOLOAD it first.
You can forbid a sub that does not exist, however a custom react sub will not have a reference to the original in such a case.
You can forbid access to an inherited method. Will work just like any other method. However calling the method on the parent class is not forbidden.
EXPORTED FUNCTIONS
- add_watchdog( watch => 'My::Package', forbid => 'Their::Package', ... )
-
See the synopsis. This is the only automatically exported function.
AUTHORS
- Chad Granum chad@opensourcery.com
COPYRIGHT
Copyright (C) 2009 OpenSourcery, LLC
Package-Watchdog 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 2 of the License, or (at your option) any later version.
Package-Watchdog 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 this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Package-Watchdog is packaged with a copy of the GNU General Public License. Please see docs/COPYING in this distribution.