metaprogramming/singleton_super_into_included_module.rb

tests/_examples/metaprogramming/singleton_super_into_included_module.rb in the metorex repository.

class Wrapper
  def initialize
    definitions = Module.new
    definitions.__send__(:define_method, :total) { |value| value * 2 }
    singleton = class << self
      self
    end
    singleton.__send__(:include, definitions)
    singleton.__send__(:define_method, :total) { |value| super(value) + 1 }
  end
end

p Wrapper.new.total(5)

class Plain
  def initialize
    definitions = Module.new do
      def total(value) = value * 3
    end
    singleton_class.include(definitions)
    singleton_class.class_eval do
      def total(value) = super + 1
    end
  end
end

p Plain.new.total(5)

greeting = Module.new { def hello = "hello" }
visitor = Object.new
visitor.extend(greeting)
def visitor.hello = super + " from an extended object"
p visitor.hello

Output:

11
16
"hello from an extended object"