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.

