use strict; use warnings; { package MyNumber; use overload '0+' => \&numify, '/' => \&division; use Scalar::Util; my %numbers; BEGIN {*MyNumber::__ = \&Scalar::Util::refaddr} sub DESTROY {delete $numbers {__ shift}} sub new {my $f; bless \$f => shift} sub set {$numbers {__ $_ [0]} = $_ [1]; $_ [0]} sub numify {$numbers {__ $_ [0]}} sub division {my $f = $numbers {__ $_ [0]}; my $s = ref ($_ [1]) =~ /MyNumber/ ? $numbers {__ $_ [1]} : $_ [1]; ($f, $s) = ($s, $f) if $_ [2]; $s ? $f / $s : undef} } my $fig_1 = MyNumber -> new -> set (get_numeric_value_from_xml (...)); my $fig_2 = MyNumber -> new -> set (get_numeric_value_from_xml (...)); my $growth = 100 * $fig_1 / $fig_2 - 100;