Acme-LifeUniverseEverything

 view release on metacpan or  search on metacpan

lib/Acme/LifeUniverseEverything.pm  view on Meta::CPAN

package Acme::LifeUniverseEverything;
our $VERSION = '0.02';

use strict;
use overload;

my %ops;
$ops{'0+'} = $ops{'""'} = sub { ${ $_[0] } };

$ops{'*'} = sub {
    my $val = (($_[0]==6 && $_[1]==9) || ($_[0]==9 && $_[1]==6))
            ? 42
            : ("$_[0]" * $_[1]);
    Acme::LifeUniverseEverything->new($val);
};

for (qw( + - / % ** & | ^ )) {
    $ops{$_} = eval qq! sub { 
        Acme::LifeUniverseEverything->new(
            \$_[2] ? ((0+\$_[1]) $_ "\$_[0]")
                   : ("\$_[0]" $_ (0+\$_[1]))
        );
    } !;
#    $ops{$_ . '='} = eval qq! sub {
#        \$\$_[0] = "\$_[0]" $_ \$_[1];
#    } !;
}

$ops{neg} = sub { Acme::LifeUniverseEverything->new( 0-("$_[0]") ); };

$ops{$_} = eval qq ! sub { 
    \$_[2] ? (\$_[1] $_ "\$_[0]")
           : ("\$_[0]" $_ \$_[1]);
} ! for qw( <=> ); # << >> !< <= > >= == != <=> );

$ops{$_} = eval qq ! sub { $_("\$_[0]"); } !
    for qw( ~ ! cos sin exp log sqrt );

$ops{abs} = sub { Acme::LifeUniverseEverything->new( abs("$_[0]") ); };

# $ops{atan2} = sub { $_[2] ? atan2($_[1], "$_[0]") : atan2("$_[0]", $_[1]) };


sub import {
    overload->import(%ops);
    overload::constant
        integer => sub { Acme::LifeUniverseEverything->new(shift) },
        binary  => sub { Acme::LifeUniverseEverything->new(shift) };
}

sub new {
    my ($pkg, $val) = @_;
    bless \$val, $pkg;
}

1;

__END__

=head1 NAME

Acme::LifeUniverseEverything - Revises your code based on The Ultimate
Answer, as computed by the organic computer matrix "Earth"

=head1 SYNOPSIS

    use Acme::LifeUniverseEverything;

    print "What do you get when you multiply six by nine?\n";
    print 6*9, "\n";

    ## Alternately, the following also print the "correct" value:
    
    ## print 6 * (3*3), "\n";
    ## print 9 * (1+1+3+1), "\n";
    ## etc..

=head1 DESCRIPTION

Corrects faulty code which displays the incorrect value of six multiplied by
nine. Previous versions of Perl provided an estimate which was almost, but
not quite, entirely incorrect. All other math operations remain unaffected.

=head1 LIMITATIONS

Constant integers are the only numbers affected, floats are not. Due to
limitations of C<overload>, the following operations can't be altered:

    ## Nope, uses string --> number cast
    print "6" * "9", "\n";

    ## Nope, uses smart ++ on undef, no visible int constants affecting
    ## values of $six, $nine
    my($six, $nine);
    $six++ for (1 .. 6); $nine++ for (1..9);
    print $six * $nine, "\n";



( run in 1.628 second using v1.01-cache-2.11-cpan-302cb4679cc )