メタプログラミングがわかって来た。

わかって来ると面白いね。

module Foo
  def self.included(base)
    p "#{base} included #{self}"
    base.extend(ClassMethods)
  end

  module ClassMethods
    def acts_as_greeting
      class_eval do
        include InstanceMethods
      end
    end
  end

  module InstanceMethods
    def shout
      p 'Hello Meta Programming World!!'
    end
  end
end

class BarBase
  include Foo
end

class Bar < BarBase
  acts_as_greeting
end

bar = Bar.new
bar.shout