NAME Data::Money - Money/currency with formatting and overloading. SYNOPSIS use Data::Money; my $price = Data::Money->new(value => 1.2. code => 'USD'); print $price; # $1.20 print $price->code; # USD print $price->format; # FMT_COMMON print $price->as_string; # $1.20 # Overloading, returns new instance my $m2 = $price + 1; my $m3 = $price - 1; my $m4 = $price * 1; my $m5 = $price / 1; my $m6 = $price % 1; # Objects work too my $m7 = $m2 + $m3; my $m8 = $m2 - $m3; my $m9 = $m2 * $m3; my $m10 = $m2 / $m3; # Modifies in place $price += 1; $price -= 1; $price *= 1; $price /= 1; # Compares against numbers if($m2 > 2) if($m2 < 3) if($m2 == 2.2) # And strings if($m2 gt '$2.00') if($m2 lt '$3.00') if($m2 eq '$2.20') # and objects if($m2 > $m3) if($m3 lt $m2) print $price->as_string('FMT_SYMBOL'); # $1.20 DESCRIPTION The Data::Money module provides basic currency formatting and number handling via Math::BigFloat: my $currency = Data::Money->new(value => 1.23); Each Data::Money object will stringify to the original value except in string context, where it stringifies to the format specified in "format". MOTIVATION Data::Money was created to make it easy to use different currencies (leveraging existing work in "Locale::Currency" and Moose), to allow math operations with proper rounding (via Math::BigFloat) and formatting via Locale::Currency::Format. OPERATOR OVERLOADING Data::Money overrides some operators. It is important to note which operators change the object's value and which return new ones. All operators accept either a Data::Money argument or a normal number via scalar, and will die if the currency types mismatch. Data::Money overloads the following operators: + Handled by the "add" method. Returns a new Data::Money object. - Handled by the "subtract" method. Returns a new Data::Money object. * Handled by the "multiply" method. Returns a new Data::Money object. / Handled by the "divide" method. Returns a new Data::Money object. += Handled by the "add_in_place" method. Modifies the left-hand object's value. Works with either a Data::Money argument or a normal number. -= Handled by the "subtract_in_place" method. Modifies the left-hand object's value. Works with either a Data::Money argument or a normal number. *= Handled by the "multiply_in_place" method. Modifies the left-hand object's value. Works with either a Data::Money argument or a normal number. /= Handled by the "divide_in_place" method. Modifies the left-hand object's value. Works with either a Data::Money argument or a normal number. <=> Performs a three way comparsion. Works with either a Data::Money argument or a normal number. ATTRIBUTES code Gets/sets the three letter currency code for the current currency object. Defaults to USD format Gets/sets the format to be used when "as_string" is called. See Locale::Currency::Format for the available formatting options. Defaults to "FMT_COMMON". name Returns the currency name for the current objects currency code. If no currency code is set the method will die. value The amount of money/currency. Defaults to 0. METHODS add($amount) Adds the specified amount to this Data::Money object and returns a new Data::Money object. You can supply either a number of a Data::Money object. Note that this does not modify the existing object. add_in_place($amount) Adds the specified amount to this Data::Money object, modifying its value. You can supply either a number of a Data::Money object. Note that this does modify the existing object. as_int Returns the object's value "in pennies" (in the US at least). It strips the value of formatting using "as_float" and of any decimals. as_float Returns objects value without any formatting. subtract($amount) Subtracts the specified amount to this Data::Money object and returns a new Data::Money object. You can supply either a number of a Data::Money object. Note that this does not modify the existing object. subtract_in_place($amount) Subtracts the specified amount to this Data::Money object, modifying its value. You can supply either a number of a Data::Money object. Note that this does modify the existing object. multiply($amount) Multiplies the value of this Data::Money object and returns a new Data::Money object. You can supply either a number of a Data::Money object. Note that this does not modify the existing object. multiply_in_place($amount) Multiplies the value of this Data::Money object, modifying its value. You can supply either a number of a Data::Money object. Note that this does modify the existing object. divide($amount) Divides the value of this Data::Money object and returns a new Data::Money object. You can supply either a number of a Data::Money object. Note that this does not modify the existing object. divide_in_place($amount) Divides the value of this Data::Money object, modifying its value. You can supply either a number of a Data::Money object. Note that this does modify the existing object. modulo Performs the modulo operation on this Data::Money object, returning a new Data::Money object with the value of the remainder. three_way_compare Compares a Data::Money object to another Data::Money object, or anything it is capable of coercing - numbers, numerical strings, or Math::BigFloat objects. Both numerical and string comparators work. negate Performs the negation operation, returning a new Data::Money object with the opposite value (1 to -1, -2 to 2, etc). absolute Returns a new Data::Money object with the value set to the absolute value of the original. clone(%params) Returns a clone (new instance) of this Data::Money object. You may optionally specify some of the attributes to overwrite. $curr->clone({ value => 100 }); # Clones all fields but changes value to 100 See MooseX::Clone for more information. stringify Sames as "as_string". as_string Returns the current objects value as a formatted currency string. SEE ALSO Locale::Currency, Locale::Currency::Format, ACKNOWLEDGEMENTS This module was originally based on Data::Currency by Christopher H. Laco but I opted to fork and create a whole new module because my work was wildly different from the original. I decided it was better to make a new module than to break back compat and surprise users. Many thanks to him for the great module. Inspiration and ideas were also drawn from Math::Currency and Math::BigFloat. Major contributions (more overloaded operators, disallowing operations on mismatched currences, absolute value, negation and unit tests) from Andrew Nelson. AUTHOR Cory G Watson, "<gphat at cpan.org>" Copyright 2010 Cory Watson 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.