1 small comment i'd like to make is on the following part:
sub add {
my $self = shift;
my @units = @{ $self->{units} };
my %pieces = %{ $self->{bills} };
my $temp = shift;
I personally use the guideline that it's best to clean out @_ and assign all the values that i need before doing anything else. 9 out of 10 times this is completely unnecessary, but consistently doing it does prevent me from leaving things in @_ only to have them changed later, yielding unpredictable results. so my advice would be to start off with
my ($self, $temp) = @_;
and then to proceed with the remainder of the sub.