NAME File::PackageIndexer - Indexing of packages and subs SYNOPSIS use File::PackageIndexer; my $indexer = File::PackageIndexer->new(); my $pkgs = $indexer->parse( $ppi_document_or_code_string ); use Data::Dumper; print Dumper $pkgs; # prints something like: # { # Some::Package => { # name => 'Some::Package', # subs => { # new => 1, # foo => 1, # }, # isa => [ 'SuperClass1', 'SuperClass2' ], # }, # ... other pkgs ... # } DESCRIPTION Parses a piece of Perl code using PPI and tries to find all subs and their packages as well as the inheritance of the packages. Currently, the following constructs are recognized: "package" statements plain subroutine declarations "Class::Accessor"-like accessor generation "Class::XSAccessor" and "Class::XSAccessor::Array" "use base ..." inheritance declaration "use parent ..." inheritance declaration "our @ISA = ..." and "@ISA = ..." inheritance declaration "push @ISA, ..." and "unshift @ISA, ..." inheritance modification The inheritance detection (hopefully) correctly recognizes the effect of special blocks such as "BEGIN {...}". "END" blocks are ignored. METHODS new Creates a new indexer object. Optional parameters: default_package The default package to assume a subroutine is in if no package statement was found beforehand. Defaults to "main". default_package Get/set default package. parse Parses a given piece of code. Alternatively, you may pass in a "PPI::Node" or "PPI::Document" object. Returns a simple hash-ref based structure containing the packages and subs found in the code. General structure: { 'Package::Name' => { subs => { subname1 => 1, subname2 => 1, ... more subs ... }, }, ... more packages ... } SEE ALSO Implemented using PPI. TODO Maybe other constructs that affect inheritance? Exporting! (yuck) Other accessor generators. Moose. This is going to be tough, but mandatory. "Class-"import(...)> is currently not handled akin to "use Class ...". General dependency resolution. AUTHOR Steffen Mueller, COPYRIGHT AND LICENSE Copyright (C) 2008 by Steffen Mueller This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8 or, at your option, any later version of Perl 5 you may have available.