diff options
author | Nicholas Clark <nick@ccl4.org> | 2009-09-26 16:00:44 +0100 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2009-09-26 17:51:17 +0100 |
commit | 75def4d9075353bc1eca69d47bbefcd65e7b6905 (patch) | |
tree | d655cd73ba90075217ccc3dd71cd1378220785f3 /cpan/Package-Constants | |
parent | 71e9501eb5f515e4c2f2e89dacb9f682c4e7fb0f (diff) | |
download | perl-75def4d9075353bc1eca69d47bbefcd65e7b6905.tar.gz |
Move Package::Constants from ext/ to cpan/
Diffstat (limited to 'cpan/Package-Constants')
-rw-r--r-- | cpan/Package-Constants/lib/Package/Constants.pm | 106 | ||||
-rw-r--r-- | cpan/Package-Constants/t/01_list.t | 52 |
2 files changed, 158 insertions, 0 deletions
diff --git a/cpan/Package-Constants/lib/Package/Constants.pm b/cpan/Package-Constants/lib/Package/Constants.pm new file mode 100644 index 0000000000..9ad6c62df4 --- /dev/null +++ b/cpan/Package-Constants/lib/Package/Constants.pm @@ -0,0 +1,106 @@ +package Package::Constants; + +use strict; +use vars qw[$VERSION $DEBUG]; + +$VERSION = '0.02'; +$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<Package::Constants> 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 BUG REPORTS + +Please report bugs or other issues to E<lt>bug-package-constants@rt.cpan.org<gt>. + +=head1 AUTHOR + +This module by Jos Boumans E<lt>kane@cpan.orgE<gt>. + +=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: diff --git a/cpan/Package-Constants/t/01_list.t b/cpan/Package-Constants/t/01_list.t new file mode 100644 index 0000000000..80f51fe759 --- /dev/null +++ b/cpan/Package-Constants/t/01_list.t @@ -0,0 +1,52 @@ +use strict; +use Test::More 'no_plan'; + +BEGIN { chdir 't' if -d 't' }; +use lib '../lib'; + +my $Class = 'Package::Constants'; +my $Func = 'list'; +my $Pkg = '_test'; +my @Good = 'A'..'C'; +my @Bad = 'D'..'E'; + +use_ok( $Class ); +can_ok( $Class, $Func ); + +### enable debug statements? +$Package::Constants::DEBUG = $Package::Constants::DEBUG = @ARGV ? 1 : 0; + + +### small test class +{ package _test; + + ### mark us as loaded + $INC{'_test.pm'} = $0; + + use vars qw[$FOO]; + $FOO = 1; + + ### define various subs.. the first 3 are constants, + ### the others are not + use constant A => 1; + use constant B => sub { 1 }; + sub C () { 1 }; + + sub D { 1 }; + sub E (*) { 1 }; + +} + +### get the list +{ my @list = $Class->$Func( $Pkg ); + ok( scalar(@list), "Got a list of constants" ); + is_deeply( \@list, \@Good, " Contains all expected entries" ); +} + + +# Local variables: +# c-indentation-style: bsd +# c-basic-offset: 4 +# indent-tabs-mode: nil +# End: +# vim: expandtab shiftwidth=4: |