oop/prepend_ancestry_parens.rb

tests/_examples/oop/prepend_ancestry_parens.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