Recall inheritance
class A
  def to_s
    "I am A"
  end
end
class B < A
  def to_s
    super() + " and I am B"
  end
end
          Issue: can only have one parent
Workaround: modules
Workaround: modules
A Module is a collection of methods and constants
# double-module.rb
module Doubler 
  def Doubler.base
    2
  end
  def double
    self + self
  end
end
# things we can do
puts Doubler.base
puts Doubler.class
puts Doubler.instance_methods
# things we cannot do
puts Doubler.new
puts Doubler.double
          How to use Module?
# triple-module.rb
module Triple 
  def triple 
    self + self + self
  end
end
class Integer
  include Triple
end
          
puts 10.triple
          Consider the following
module M1
  def bye
      "So long"
  end
end
module M2
  def bye
      "Goodbye"
  end
end
class C
  include M1
  include M2
  def bye 
    "C you later"
  end
end
          What happens?
sea = C.new
puts sea.bye
          What if we change some things
class C
  include M1
  include M2
end
# get rid of C's bye
c = C.new
puts c.bye
class C
  include M2
  include M1
end
# get rid of C's bye and swap order
c = C.new
puts c.bye
# consider
c.class.ancestors
class A
  def to_s
    "A"
  end
end
class B < A
  include M1
  
  def to_s
    "B"
  end
end
puts B.new.class.ancestors
          Common Modules you may see or need to include
class Name
  attr_accessor :first
  include Comparable
  def <=>(other) #need to overwrite this
    if @first > other.first 
      1
    elsif @first < other.first 
      -1 
    else
      0
    end
  end
class Class
  attr_accessor :roster
  include Enumerable
  def each # need to overwrite this
    for person in roster
      yield person
    end
  end
end