metaprogramming/method_added_chain.rb

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

module Tracking
  def method_added(name)
    super(name)
    (@seen ||= []) << name
  end

  def singleton_method_added(name)
    super(name)
    (@singletons ||= []) << name
  end
end

module Counting
  def method_added(name)
    super
    @count = (@count || 0) + 1
  end
end

class Rates
  extend(Tracking)
  extend(Counting)

  class << self
    def method_added(name)
      super
      @last = name
    end

    attr_reader(:seen, :count, :last, :singletons)
  end

  attr_writer :region
  attr_accessor :currency
  def load_rates = 1
  def store_rates = 2
  def self.refresh = 3
end

p([Rates.seen, Rates.count, Rates.last])
p(Rates.singletons)

Output:

[[:region=, :currency, :currency=, :load_rates, :store_rates], 5, :store_rates]
[:method_added, :seen, :count, :last, :singletons, :refresh]