#!/usr/bin/ruby -w

# Dr. Dobb's Journal August 1998, C++ Interfaces
#
#    Machine                  Person
#       |          MakeFries     |
# FrenchFryMaker-o           o-Chef
#

# interface, includers must define makeFries
module MakeFriesInterface
  # define all public members and methods
  # member: attr_accessor x
  # method: def f(); raise; end
  def makeFries(); raise; end
end

class Person
end

class Chef < Person
  include MakeFriesInterface
  def makeFries
    print "Chef making fries\n"
  end
end

class HoopyDude < Person
  include MakeFriesInterface
  # calling makeFries on this class causes an unhandled exception
end

class Machine
end

class FrenchFryMaker < Machine
  include MakeFriesInterface
  def makeFries
    print "FrenchFryMaker making fries\n"
  end
end

frymakers = []
frymakers << Chef.new
#frymakers << HoopyDude.new             # raises exception
frymakers << FrenchFryMaker.new

frymakers.each{ |fm|
  fm.makeFries
}
