The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Math::Calc::Euro;
use strict;
use Carp;

use vars '$VERSION';
$VERSION = 0.02;

my %rates = qw(	LUF 40.3399	ATS 13.76	BEF 40.3399
		NLG 2.20371	FIM 5.94574	FRF 6.55957
		DEM 1.94483	GRD 340.75	IEP 0.787564
		ITL 1936.27	PTE 200.482	ESP 166.386 );

sub new {
    my ($proto, $currency) = @_;
    my $rate = defined $currency && (
		   $rates{uc $currency} || 0 + $currency
	       ) ||
	       ( ref $proto eq __PACKAGE__ ?
	           $$proto
	       :
	           croak("Invalid currency")
	       );
    return bless \$rate, ref($proto) || $proto;
}

sub to_euro {
    my ($self, $amount) = @_;
    return $amount / $$self;
}

sub to_national {
    my ($self, $amount) = @_;
    return $amount * $$self;
}

sub from_euro { goto &to_national }
sub from_national { goto &to_euro }
sub clone { goto &new }
1;

__END__

=head1 NAME

Math::Calc::Euro - convert between EUR and the old currencies

=head1 SYNOPSIS

    my $guildercalc = Math::Calc::Euro->new('NLG')
    print $guildercalc->to_euro(1), "\n"; # 0.45378...
    print $guildercalc->from_national(1), "\n"; # same
    print $guildercalc->to_national(1), "\n"; # 2.20371
    print $guildercalc->from_euro(1), "\n"; # same

=head1 DESCRIPTION

The Math::Calc::Euro module provides for an object oriented
interface for converting to/from EUR.

=over 10

=item new / clone

Takes one argument: the currency. Either one of these:
LUF ATS BEF NLG FIM FRF DEM GRD IEP ITL PTE ESP
or a number indicating how much the national currency is worth
in euro's.
When used as an object method, it defaults to the object's rate.

=item to_euro / from_national

Returns the value in euro's.
Takes one argument: the amount of money.

=item to_national / from_euro

Returns the value in the old currency.
Takes one argument: the amount of euro's.

=back

=head1 KNOWN BUGS

None yet

=head1 AUTHOR

Juerd <juerd@juerd.nl>

=cut