summaryrefslogtreecommitdiff
path: root/cpan/Package-Constants
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2009-09-26 16:00:44 +0100
committerNicholas Clark <nick@ccl4.org>2009-09-26 17:51:17 +0100
commit75def4d9075353bc1eca69d47bbefcd65e7b6905 (patch)
treed655cd73ba90075217ccc3dd71cd1378220785f3 /cpan/Package-Constants
parent71e9501eb5f515e4c2f2e89dacb9f682c4e7fb0f (diff)
downloadperl-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.pm106
-rw-r--r--cpan/Package-Constants/t/01_list.t52
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: