# Customer.pm package Customer; use Modern::Perl; use Moose; use MooseX::StrictConstructor; use MooseX::Params::Validate; use Rental; has 'name' => ( is => 'ro', isa => 'Str', required => 1, reader => 'getName', ); has 'rentals' => ( is => 'ro', isa => 'ArrayRef[Rental]', default => sub { [] }, reader => '_getRentals', ); sub addRental { my $self = shift; my ($rental) = pos_validated_list(\@_, { isa => 'Rental' }); push @{ $self->_getRentals }, $rental; return; } sub statement { my $self = shift; my $result = 'Rental Record for ' . $self->getName . "\n"; for my $each (@{ $self->_getRentals }) { # show figures for this rental $result .= "\t" . $each->getMovie->getTitle . "\t" . $each->getCharge . "\n"; } # add footer lines $result .= "Amount owed is " . $self->getTotalCharge . "\n"; $result .= "You earned " . $self->getTotalFrequentRenterPoints . " frequent renter points"; return $result; } sub getTotalCharge { my $self = shift; my $result = 0.0; for my $each (@{ $self->_getRentals }) { $result += $each->getCharge; } return $result; } sub getTotalFrequentRenterPoints { my $self = shift; my $result = 0; for my $rental (@{ $self->_getRentals }) { $result += $rental->getFrequentRenterPoints; } return $result; } no Moose; __PACKAGE__->meta->make_immutable; 1;