Acme-Tao
view release on metacpan or search on metacpan
have enough time and space to accomplish their goals.
How could it be otherwise?
-- Geoffrey James, "The Tao of Programming"
),
);
sub import {
my $class = shift;
if(@_) {
my($pkg, $file, $line) = caller;
foreach my $v (@_) {
# this is based on the perl 5.6.1 perldoc (perldoc constant)
# not sure why we have to pass $v through a regex -- otherwise,
# it gives us an error that we are trying to modify a constant
# value (which might be due to the pos($v) being modified)
$v =~ m{(.*)};
my $u = $1;
$u =~ s/^::/main::/;
my $full_name = $v =~ m{::} ? $u : "${pkg}::$u";
die "Uh, Oh! $full_name was declared constant before line $line of $file.\n"
if $constant::declared{$full_name};
}
}
else {
if(grep /::Tao$/, keys %constant::declared) {
my @isas = ($class, @{"${class}::ISA"});
my $messages;
while(@isas) {
my $c = shift @isas;
if(@{"${c}::ISA"}) {
unshift @isas, @{"${c}::ISA"};
}
if(@{"${c}::messages"}) {
$messages = \@{"${c}::messages"};
last;
}
}
# randomly determine if we die or not
return if rand(rand) < rand(rand);
die "The Tao is not constant:\n", $messages->[rand @$messages], "\n"
}
}
}
1;
__END__
=head1 NAME
Acme::Tao - strongly suggests proper respect for the Tao
=head1 SYNOPSIS
use Acme::Tao;
or
use Acme::Tao qw(something_that_must_not_be_constant);
=head1 DESCRIPTION
Everyone knows that the Tao is not constant. But some people just
might not get it. To make sure no one tries to use constant Tao
in a program with your module, put a C<use Acme::Tao> at the top
of your code. If Tao has been made constant by time your module
is used, Acme::Tao may die with a nice message. Note that the
package in which Tao is constant is irrelavent.
On a walk between shrines in Nikko, Japan, I had an epiphany: if the
Tao is not constant, than neither should Acme::Tao be constant.
The Tao doesn't take sides;
it gives birth to both wins and losses.
Acme::Tao doesn't take sides either, at least not consistently. It
will sometimes die and sometimes not (50% chance of it doing so), in
accordance with its understanding of the nature of the Tao.
As Lao-tzu teaches, "The name that can be named is not the constant
name," and Acme::Tao can *also* be used to check for any other
symbols you might not want to have as constants. When used in this
fashion, it will always try to work.
For example:
use Acme::Tao qw(foo);
This will die if C<foo> is defined as a constant in the current package.
use Acme::Tao qw(::foo);
This will die if C<foo> is defined as a constant in the C<main::>
package. This is the same as C<main::foo>.
If Acme::Tao is checking for particular symbols, it will not check
for a constant Tao.
=head1 MESSAGES
The messages are stored in C<@__PACKAGE__::messages>. Feel free to
add to them. You can even subclass Acme::Tao:
package My::Tao;
use Acme::Tao ();
use vars(@messages @ISA);
@ISA = qw(Acme::Tao);
@messages = ( ... );
1;
__END__
The messages will come from the appropriate package and are not cumulative.
=head1 AUTHOR
( run in 0.761 second using v1.01-cache-2.11-cpan-9581c071862 )