Module::Info - Information about Perl modules
  use Module::Info;
  my $mod = Module::Info->new_from_file('Some/Module.pm');
  my $mod = Module::Info->new_from_module('Some::Module');
  my $mod = Module::Info->new_from_loaded('Some::Module');
  my @mods = Module::Info->all_installed('Some::Module');
  my $name    = $mod->name;
  my $version = $mod->version;
  my $dir     = $mod->inc_dir;
  my $file    = $mod->file;
  my $is_core = $mod->is_core;
  # Only available in perl 5.6.1 and up.
  # These do compile the module.
  my @packages = $mod->packages_inside;
  my @used     = $mod->modules_used;
  my @subs     = $mod->subroutines;
  my @isa      = $mod->superclasses;
  my @calls    = $mod->subroutines_called;
  # Check for constructs which make perl hard to predict.
  my @methods   = $mod->dynamic_method_calls;
  my @lines     = $mod->eval_string;    *UNIMPLEMENTED*
  my @lines     = $mod->gotos;          *UNIMPLEMENTED*
  my @controls  = $mod->exit_via_loop_control;      *UNIMPLEMENTED*
  my @unpredictables = $mod->has_unpredictables;    *UNIMPLEMENTED*
  # set/get Module::Info options
  $self->die_on_compilation_error(1);
  my $die_on_error = $mod->die_on_compilation_error;
  $self->safe(1);
  my $safe = $mod->safe;
Module::Info gives you information about Perl modules
    without actually loading the module. It actually isn't
    specific to modules and should work on any perl code.
There are a few ways to specify which module you want information
    for. They all return Module::Info objects.
  - new_from_file
- 
      my $module = Module::Info->new_from_file('path/to/Some/Module.pm');
    Given a file, it will interpret this as the module you want
        information about. You can also hand it a perl script. If the file doesn't exist or isn't readable it will return
        false. 
- new_from_module
- 
      my $module = Module::Info->new_from_module('Some::Module');
  my $module = Module::Info->new_from_module('Some::Module', @INC);
    Given a module name, @INC will be
        searched and the first module found used. This is the same module that
        would be loaded if you just say "use
        Some::Module". If you give your own @INC, that will
        be used to search instead. 
- new_from_loaded
- 
      my $module = Module::Info->new_from_loaded('Some::Module');
    Gets information about the currently loaded version of
        Some::Module. If it isn't loaded, returns false. 
- all_installed
- 
      my @modules = Module::Info->all_installed('Some::Module');
  my @modules = Module::Info->all_installed('Some::Module', @INC);
    Like new_from_module(), except all modules in
        @INC will be returned, in the order they are
        found. Thus $modules[0] is the one that would be
        loaded by "use Some::Module". 
The following methods get their information without actually
    compiling the module.
  - name
- 
      my $name = $module->name;
  $module->name($name);
    Name of the module (ie. Some::Module). Module loaded using new_from_file() won't have this
        information in which case you can set it yourself. 
- version
- 
      my $version = $module->version;
    Divines the value of $VERSION. This
        uses the same method as ExtUtils::MakeMaker and all caveats therein
        apply. 
- inc_dir
- 
      my $dir = $module->inc_dir;
    Include directory in which this module was found. Module::Info
        objects created with new_from_file() won't have this info. 
- file
- 
      my $file = $module->file;
    The absolute path to this module. 
- is_core
- 
      my $is_core = $module->is_core;
    Checks if this module is the one distributed with Perl. NOTE This goes by what directory it's in. It's possible
        that the module has been altered or upgraded from CPAN since the
        original Perl installation. 
- has_pod
- 
        my $has_pod = $module->has_pod;
    Returns the location of the module's pod, which can be the
        module file itself, if the POD is inlined, the associated POD file, or
        nothing if there is no POD at all. 
WARNING! From here down reliability drops rapidly!
The following methods get their information by compiling the
    module and examining the opcode tree. The module will be compiled in a
    separate process so as not to disturb the current program.
They will only work on 5.6.1 and up and requires the B::Utils
    module.
  - packages_inside
- 
      my @packages = $module->packages_inside;
    Looks for any explicit
        "package" declarations inside the
        module and returns a list. Useful for finding hidden classes and
        functionality (like Tie::StdHandle inside Tie::Handle). KNOWN BUG Currently doesn't spot package changes inside
        subroutines. 
- package_versions
- 
      my %versions = $module->package_versions;
    Returns a hash whose keys are the packages contained in the
        module (these are the same as what's returned by
        packages_inside()), and whose values are the
        versions of those packages. 
- modules_used
- 
      my @used = $module->modules_used;
    Returns a list of all modules and files which may be
        "use"'d or
        "require"'d by this module. NOTE These modules may be conditionally loaded, can't
        tell. Also can't find modules which might be used inside an
        "eval". 
- modules_required
- 
      my %required = $module->modules_required;
    Returns a list of all modules and files which may be
        "use"'d or
        "require"'d by this module, together
        with the minimum required version. The hash is keyed on the module/file name, the corrisponding
        value is an array reference containing the requied versions, or an empty
        array if no specific version was required. NOTE These modules may be conditionally loaded, can't
        tell. Also can't find modules which might be used inside an
        "eval". 
- subroutines
- 
      my %subs = $module->subroutines;
    Returns a hash of all subroutines defined inside this module
        and some info about it. The key is the *full* name of the subroutine
        (ie. $subs{'Some::Module::foo'} rather than just
        $subs{'foo'}), value is a hash ref with
        information about the subroutine like so:     start   => line number of the first statement in the subroutine
    end     => line number of the last statement in the subroutine
    Note that the line numbers may not be entirely accurate and
        will change as perl's backend compiler improves. They typically
        correspond to the first and last run-time statements in a
        subroutine. For example:     sub foo {
        package Wibble;
        $foo = "bar";
        return $foo;
    }
    Taking "sub foo {" as line
        1, Module::Info will report line 3 as the start and line 4 as the end.
        "package Wibble;" is a compile-time
        statement. Again, this will change as perl changes. Note this only catches simple "sub foo
        {...}" subroutine declarations. Anonymous, autoloaded or
        eval'd subroutines are not listed. 
- superclasses
- 
      my @isa = $module->superclasses;
    Returns the value of @ISA for this
        $module. Requires that
        $module->name be set to work. NOTE superclasses() is currently cheating. See
        CAVEATS below. 
- subroutines_called
- 
      my @calls = $module->subroutines_called;
    Finds all the methods and functions which are called inside
        the $module. Returns a list of hashes. Each hash represents a single
        function or method call and has the keys:     line        line number where this call originated
    class       class called on if its a class method
    type        function, symbolic function, object method, 
                class method, dynamic object method or 
                dynamic class method.
                (NOTE  This format will probably change)
    name        name of the function/method called if not dynamic
    
Unpredictable constructs are things that make a Perl program hard
    to predict what its going to do without actually running it. There's nothing
    wrong with these constructs, but its nice to know where they are when
    maintaining a piece of code.
  - dynamic_method_calls
- 
      my @methods = $module->dynamic_method_calls;
    Returns a list of dynamic method calls (ie.
        "$obj-"$method()>) used by
        the $module. @methods
        has the same format as the return value of
      subroutines_called(). 
The following methods get/set specific option values for the
    Module::Info object.
  - die_on_compilation_error
- 
      $module->die_on_compilation_error(0); # default
  $module->die_on_compilation_error(1);
  my $flag = $module->die_on_compilation_error;
    Sets/gets the "die on compilation error" flag. When
        the flag is off (default), and a module fails to compile, Module::Info
        simply emits a watning and continues. When the flag is on and a module
        fails to compile, Module::Info die()s with the
        same error message it would use in the warning. 
- safe
- 
      $module->safe(0); # default
  $module->safe(1); # be safer
  my $flag = $module->safe;
    Sets/gets the "safe" flag. When the flag is enabled
        all operations requiring module compilation are forbidden and the
        version() method executes its code in a
        "Safe" compartment. 
- use_version
- 
      $module->use_version(0); # do not use version.pm (default)
  $module->use_version(1); # use version.pm, die if not present
  my $flag = $module->use_version;
    Sets/gets the "use_version" flag. When the flag is
        enabled the 'version' method always returns a version object. 
<https://github.com/neilb/Module-Info>
Michael G Schwern <schwern@pobox.com> with code from
    ExtUtils::MM_Unix, Module::InstalledVersion and lots of cargo-culting from
    B::Deparse.
Mattia Barbon <mbarbon@cpan.org> maintained the module from
    2002 to 2013.
Neil Bowers <neilb@cpan.org> is the current maintainer.
This program is free software; you can redistribute it and/or
    modify it under the same terms as Perl itself.
Many thanks to Simon Cozens and Robin Houston for letting me chew
    their ears about B.
Code refs in @INC are currently ignored.
    If this bothers you submit a patch.
superclasses() is cheating and just loading the module in a
    separate process and looking at @ISA. I don't think
    its worth the trouble to go through and parse the opcode tree as it still
    requires loading the module and running all the BEGIN blocks. Patches
    welcome.
I originally was going to call superclasses() isa()
    but then I remembered that would be bad.
All the methods that require loading are really inefficient as
    they're not caching anything. I'll worry about efficiency later.