oop/prepend_ancestry.rb

tests/_examples/oop/prepend_ancestry.rb in the metorex repository.

module Logging
  CHANNEL = "logging"

  def describe
    "logged: #{super}"
  end
end

class Report
  prepend Logging

  CHANNEL = "report"

  def describe
    "report"
  end

  def self.channel
    CHANNEL
  end
end

report = Report.new
puts report.describe
puts Report.ancestors.first
puts Report.ancestors.take(2).last
puts report.is_a? Logging
puts Report.channel
puts Report.constants.include? :CHANNEL

class Detailed < Report
  def describe
    "detailed: #{super}"
  end
end

puts Detailed.new.describe

module Shared
end

class Base
  include Shared
end

class Derived < Base
  prepend Shared
end

puts Derived.ancestors.select { |ancestor| ancestor == Shared }.length

begin
  Class.new { prepend }
rescue ArgumentError
  puts "ArgumentError"
end

class Alone
  prepend Logging
end

begin
  Alone.new.describe
rescue NoMethodError => error
  puts error.message
end

Output:

logged: report
Logging
Report
true
report
true
detailed: logged: report
2
ArgumentError
super: no superclass method 'describe' for an instance of Alone