package Package::Constants; use if $] >= 5.019006, 'deprecate'; use 5.006; use strict; use warnings; our $VERSION = '0.06'; our $DEBUG = 0; =head1 NAME Package::Constants - List all constants declared in a package =head1 SYNOPSIS use Package::Constants; ### list the names of all constants in a given package; @const = Package::Constants->list( __PACKAGE__ ); @const = Package::Constants->list( 'main' ); ### enable debugging output $Package::Constants::DEBUG = 1; =head1 DESCRIPTION C lists all the constants defined in a certain package. This can be useful for, among others, setting up an autogenerated C<@EXPORT/@EXPORT_OK> for a Constants.pm file. =head1 CLASS METHODS =head2 @const = Package::Constants->list( PACKAGE_NAME ); Lists the names of all the constants defined in the provided package. =cut sub list { my $class = shift; my $pkg = shift; return unless defined $pkg; # some joker might use '0' as a pkg... _debug("Inspecting package '$pkg'"); my @rv; { no strict 'refs'; my $stash = $pkg . '::'; for my $name (sort keys %$stash ) { _debug( " Checking stash entry '$name'" ); ### is it a subentry? my $sub = $pkg->can( $name ); next unless defined $sub; _debug( " '$name' is a coderef" ); next unless defined prototype($sub) and not length prototype($sub); _debug( " '$name' is a constant" ); push @rv, $name; } } return sort @rv; } =head1 GLOBAL VARIABLES =head2 $Package::Constants::DEBUG When set to true, prints out debug information to STDERR about the package it is inspecting. Helps to identify issues when the results are not as you expect. Defaults to false. =cut sub _debug { warn "@_\n" if $DEBUG; } 1; =head1 SEE ALSO L - get a list of all the public functions defined in a package. =head1 BUG REPORTS Please report bugs or other issues to Ebug-package-constants@rt.cpan.org. =head1 AUTHOR This module by Jos Boumans Ekane@cpan.orgE. =head1 COPYRIGHT This library is free software; you may redistribute and/or modify it under the same terms as Perl itself. =cut # Local variables: # c-indentation-style: bsd # c-basic-offset: 4 # indent-tabs-mode: nil # End: # vim: expandtab shiftwidth=4: