require 'pp' class Movie attr_reader :title attr_writer :price def initialize(title, the_price_code) @title, @price = title, the_price_code end def charge(days_rented) @price.charge(days_rented) end def frequent_renter_points(days_rented) @price.frequent_renter_points(days_rented) end end class Price def frequent_renter_points(days_rented) 1 end end class RegularPrice < Price # include Price def charge(days_rented) result =2 result += (days_rented-2)*1.5 if days_rented > 2 result end end class NewReleasePrice < Price def frequent_renter_points(days_rented) days_rented > 1 ? 2 : 1 end def charge(days_rented) days_rented*3 end end class ChildrensPrice < Price # include Price def charge(days_rented) result =1.5 result += (days_rented-3)*1.5 if days_rented > 3 result end end class Rental attr_reader :movie, :days_rented def initialize(movie, days_rented) @movie, @days_rented = movie, days_rented end def charge movie.charge(days_rented) end def frequent_renter_points movie.frequent_renter_points(days_rented) end end class Customer attr_reader :name def initialize(name) @name=name @rentals = [] end def add_rental(arg) @rentals << arg end def statement result="Rental Record for #{@name}\n" @rentals.each do |element| result += "\t"+element.movie.title + "\t"+element.charge.to_s + "\n" end result += "Amount owed is #{total_charge}\n" result += "You earned #{frequent_renter_points} frequent renter points" result end def html_statement result="
\n"
@rentals.each do |element|
result += "\t"+element.movie.title + "\t"+element.charge.to_s + "
\n"
end
result += "
You owe #{total_charge}
\n" result += "On this rental you earned "+ "#{frequent_renter_points} "+ "frequent renter points
" result end private def total_charge @rentals.inject(0){ |sum, rental| sum + rental.charge} end def frequent_renter_points @rentals.inject(0){ |sum, rental| sum + rental.frequent_renter_points} end end if __FILE__ == $0 matrix=Movie.new('Matrix', RegularPrice.new) mj=Movie.new('MJ', NewReleasePrice.new) totoro=Movie.new('Totoro', ChildrensPrice.new) gundam=Movie.new('Gundam', ChildrensPrice.new) pp mj p mj.title #totoro.price = RegularPrice.new #p totoro.price_code=Movie::REGULAR #p mj.title="Michael Jackson" me=Customer.new('Nishitani') me.add_rental(Rental.new(matrix,2)) me.add_rental(Rental.new(mj,4)) me.add_rental(Rental.new(totoro,6)) me.add_rental(Rental.new(gundam,3)) #pp me print me.statement+ "\n" print me.html_statement+ "\n" end