The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Finance::USDX;

use parent 'Exporter';
our @EXPORT = ('usdx');

use 5.006;
use strict;
use warnings;

use Finance::Quote;

=encoding UTF-8

=head1 NAME

Finance::USDX - Compute USDX (US Dollar Index)

=head1 VERSION

Version 0.01

=cut

our $VERSION = '0.01';


=head1 SYNOPSIS

    use Finance::USDX;

    # get "live" USDX using YAHOO finance values (through Finance::Quote)
    my $usdx = usdx();

    # compute USDX given specfic conversion rates
    my $usdx = usdx(eurusd => 1.2976, usdjpy => 79.846,
                    gbpusd => 1.5947, usdcad => 0.9929,
                    usdsek => 6.6491, usdchf => 0.9331);

=head1 DESCRIPTION

Just exports an 'usdx' subroutine that returns the current USDX value.

=head2 usdx

If called without arguments, returns the "current" USDX value using
data from YAHOO finance website, using Finance::Quote module.

If called with argument, then the hashtable must have six key/value
pairs, with rates for currency convertion. Note that two of the keys
are not usd->other convertions. All exact keys are required.

=cut

sub usdx {
    my ($eurusd, $usdjpy, $gbpusd, $usdcad, $usdsek, $usdchf);
    my @keys = qw(eurusd usdjpy gbpusd usdcad usdsek usdchf);
    if (@_) {
        my %values = @_;
        for my $k (@keys) {
            die "Call to 'usdx' misses key '$k'" unless exists($values{$k});
            eval "\$$k = \$values{\$k};"
        }
    } else {
        my $q = Finance::Quote->new;
        $eurusd = $q->currency('EUR' => 'USD');
        $usdjpy = $q->currency('USD' => 'JPY');
        $gbpusd = $q->currency('GBP' => 'USD');
        $usdcad = $q->currency('USD' => 'CAD');
        $usdsek = $q->currency('USD' => 'SEK');
        $usdchf = $q->currency('USD' => 'CHF');
    }
    my $usdx = 50.14348112 * $eurusd**(-0.576) * $usdjpy**(0.136) * $gbpusd**(-0.119) * $usdcad**(0.091) * $usdsek**(0.042) * $usdchf**(0.036);
    return $usdx;
}

=head1 AUTHOR

Alberto Simões, C<< <ambs at cpan.org> >>

=head1 BUGS

Please report any bugs or feature requests to C<bug-finance-usdx at
rt.cpan.org>, or through the web interface at
L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Finance-USDX>.  I
will be notified, and then you'll automatically be notified of
progress on your bug as I make changes.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc Finance::USDX

You can also look for information at:

=over 4

=item * RT: CPAN's request tracker (report bugs here)

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Finance-USDX>

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/Finance-USDX>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/Finance-USDX>

=item * Search CPAN

L<http://search.cpan.org/dist/Finance-USDX/>

=back

=head1 LICENSE AND COPYRIGHT

Copyright 2012 Alberto Simões.

This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.


=cut

1; # End of Finance::USDX