# 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 $totalAmount = 0.0; my $frequentRenterPoints = 0; my $result = 'Rental Record for ' . $self->getName . "\n"; for my $each (@{ $self->_getRentals }) { my $thisAmount = $self->_amountFor($each); # add frequent renter points ++$frequentRenterPoints; # add bonus for a two day new release rental if (($each->getMovie->getPriceCode == $Movie::NEW_RELEASE) && $each->getDaysRented > 1) { ++$frequentRenterPoints; } # show figures for this rental $result .= "\t" . $each->getMovie->getTitle . "\t$thisAmount\n"; $totalAmount += $thisAmount; } # add footer lines $result .= "Amount owed is $totalAmount\n"; $result .= "You earned $frequentRenterPoints frequent renter points"; return $result; } sub _amountFor { my ($self, $each) = @_; my $thisAmount = 0.0; given ($each->getMovie->getPriceCode) { when ($Movie::REGULAR) { $thisAmount += 2.0; if ($each->getDaysRented > 2) { $thisAmount += ($each->getDaysRented - 2) * 1.5; } } when ($Movie::NEW_RELEASE) { $thisAmount += $each->getDaysRented * 3; } when ($Movie::CHILDRENS) { $thisAmount += 1.5; if ($each->getDaysRented > 3) { $thisAmount += ($each->getDaysRented - 3) * 1.5; } } } return $thisAmount; } no Moose; __PACKAGE__->meta->make_immutable; 1;