Skip to content

Instantly share code, notes, and snippets.

class TicketFactory
def self.ticket_for opts
class_for(opts[:vehicle_type]).new(opts)
end
# Method to auto generate class from a vehicle_type
# e.g "Private car" => PrivateCarParkingTicket
# "Matatu" => MatatuParkingTicket
def self.class_for vehicle_type
prefix = vehicle_type.underscore.parameterize("_").camelize
class TicketFactory
TICKET_CLASSES = {
'Truck' => TruckParkingTicket,
'Matatu' => MatatuParkingTicket,
'Public Bus' => PublicBusParkingTicket
}
def self.ticket_for opts
# .fetch takes a second argument as a default if the
# key is not found
parking_ticket = TicketFactory.ticket_for(opts)
# where opts is the hash for options
class TicketFactory
def self.ticket_for opts
class_for(opts[:vehicle_type]).new(opts)
end
def self.class_for vehicle_type
case vehicle_type
when 'Truck'
TruckParkingTicket
when 'Matatu'
class PublicBusParkingTicket < ParkingTicket
def total_cost
@eet_passed == true ? surcharge : super
end
end
class MatatuParkingTicket < ParkingTicket
def base_fee
1100
end
def surcharge
weekdays.inlcude?(@day) ? super * 1.5 : super
end
private
class TruckParkingTicket < ParkingTicket
def base_fee
1200
end
def surcharge
super * 1.5
end
end
class ParkingTicket
def initialize(opts)
@day = opts[:day] || raise(":day is required")
@vehicle_type = opts[:vehicle_type] || raise(":vehicle_type is required")
@eet_passed = opts[:eet_passed] || raise(":eet_passed is required")
...
end
def base_fee
1000
def beat_up thing
...
thing.make_sound
...
end
# thing can be an Animal, or a Dog, and this code will work.
class Animal
def initialize(name)
@name = name
end
def make_sound
puts "No sound"
end
end