NAME

SNMP::Info::MRO - Method resolution introspection for SNMP::Info

SYNOPSIS

use SNMP::Info::MRO;
use Data::Printer;

# SNMP::Info::MRO::print_* functions
SNMP::Info::MRO::print_superclasses ('SNMP::Info::Layer3::Juniper');

# print output using Data::Printer for other functions
my $buff = SNMP::Info::MRO::all_methods('SNMP::Info::Layer3::Juniper');
p $buff;

DESCRIPTION

This is a set of helpers to show where a given method in SNMP::Info has been implemented, and which implementation is being used at runtime.

The following distributions are required to run this code:

  • PPI

  • Class::ISA

  • Module::Info

  • Module::Load

FUNCTIONS

None of the functions are exported. For all helper functions, you can pass either the name of a Perl module, or an object instance of SNMP::Info.

all_methods( $module )

Returns the location of methods defined in $module and all its ancestor classes (superclasses), either as Perl subroutines or via %GLOBALS or %FUNCS configuration. The data structure looks like:

{
  method_name => {
    globals => [
      [ Package::Name        => 'mib_leaf.0' ],
      [ Other::Package::Name => '1.3.6.1.4.1.9.2.1.58.0' ],
    ],
  },
  other_method_name => [
    subs => [
      'Package::Name',
    ],
    funcs => [
      [ Package::Name => 'mib_leaf_name' ],
    ],
  ],
}

It should be noted that the order of method resolution in SNMP::Info is to first look for a defined subroutine (this is done by Perl), then the AUTOLOAD sequence will search for a definition in %GLOBALS followed by %FUNCS.

The defining class or module at runtime is always the first entry in the list, if it exists:

$data->{method_name}->{subs}->[0]
  if exists $data->{method_name}->{subs};
subroutines( $module )

Returns the set of subroutines defined in $module and all its ancestor classes (superclasses). The data structure looks like:

{
  method_name => [
    'Package::Name',
    'Other::Package::Name',
  ],
  other_method_name => [
    'Package::Name',
  ],
}

Should a subroutine have been defined more than once, the defining classes are listed in reverse order, such that the definition used at runtime is always:

$data->{method_name}->[0];
globals( $module || $object )

Returns a data structure showing how SNMP::Info will resolve MIB Leaf Nodes configured through the %GLOBALS hashes in $module.

The data structure looks like:

{
  method_name => [
    [ Package::Name        => 'mib_leaf_name' ],
    [ Other::Package::Name => '1.3.6.1.4.1.9.2.1.58.0' ],
  ],
  other_method_name => [
    [ Package::Name => 'mib_leaf.0' ],
  ],
}

Where a method has been defined in different packages, then they are listed in reverse order, such that the mapping used by SNMP::Info is always:

$data->{method_name}->[0];
funcs( $module || $object )

Returns a data structure showing how SNMP::Info will resolve MIB Tables configured through the %FUNCS hashes in $module.

See "GLOBALS" in SNMP::Info::Layer3 for further detail.

munge( $module || $object )

Returns a data structure showing the subroutines used for munging returned values for any method defined in %FUNCS or %GLOBALS.

The data structure looks like:

{
  method_name => [
    [ Package::Name        => '&subroutine' ],
    [ Other::Package::Name => '&Other::Package::subroutine' ],
  ],
  other_method_name => [
    [ Package::Name => '&subroutine' ],
  ],
}

Where a mapping has been defined in different packages, then they are listed in reverse order, such that the munge subroutine used by SNMP::Info is always:

$data->{method_name}->[0];
file( $module )

Returns the filename from which Perl will load the given module.

superclasses( $class || $object )

Returns the list (in order) of the names of classes Perl will search to find methods for this SNMP::Info class or object instance.

Note this requires the Class:ISA distribution to be installed.

Pretty print the output of globals().

Pretty print the output of funcs().

Pretty print the output of munge().

Pretty print the output of superclasses().

AUTHOR

Oliver Gorwits <oliver@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by The SNMP::Info Project.

# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
#    * Redistributions of source code must retain the above copyright notice,
#      this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above copyright
#      notice, this list of conditions and the following disclaimer in the
#      documentation and/or other materials provided with the distribution.
#    * Neither the name of the University of California, Santa Cruz nor the
#      names of its contributors may be used to endorse or promote products
#      derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.