# Price.pm use Modern::Perl; use Movie; { package Price; use Moose::Role; requires qw(getPriceCode getCharge); sub getFrequentRenterPoints { return 1 } no Moose::Role; } { package ChildrensPrice; use Moose; with 'Price'; sub getPriceCode { return $Movie::CHILDRENS } sub getCharge { my ($self, $daysRented) = @_; my $result = 1.5; if ($daysRented > 3) { $result += ($daysRented - 3) * 1.5; } return $result; } no Moose; __PACKAGE__->meta->make_immutable; } { package NewReleasePrice; use Moose; with 'Price'; sub getPriceCode { return $Movie::NEW_RELEASE } sub getCharge { my ($self, $daysRented) = @_; return $daysRented * 3; } sub getFrequentRenterPoints { my ($self, $daysRented) = @_; return ($daysRented > 1) ? 2 : 1; } no Moose; __PACKAGE__->meta->make_immutable; } { package RegularPrice; use Moose; with 'Price'; sub getPriceCode { return $Movie::REGULAR } sub getCharge { my ($self, $daysRented) = @_; my $result = 2.0; if ($daysRented > 2) { $result += ($daysRented - 2) * 1.5; } return $result; } no Moose; __PACKAGE__->meta->make_immutable; } 1;