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


    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;


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 file.


=head2 @const = Package::Constants->list( PACKAGE_NAME );

Lists the names of all the constants defined in the provided package.


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;


=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.


sub _debug { warn "@_\n" if $DEBUG; }


=head1 SEE ALSO

L<Module::Functions> - get a list of all the public functions defined in a package.


Please report bugs or other issues to E<lt><gt>.

=head1 AUTHOR

This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.


This library is free software; you may redistribute and/or modify it
under the same terms as Perl itself.


# Local variables:
# c-indentation-style: bsd
# c-basic-offset: 4
# indent-tabs-mode: nil
# End:
# vim: expandtab shiftwidth=4: