Расширение метода класса в модуле

Я играю с функциями метапрограммирования Ruby, и мне это кажется немного странным. Я пытаюсь обернуть вызов метода с помощью модуля. В настоящее время я делаю следующее:

module Bar
  module ClassMethods
    def wrap(method)
      class_eval do
        old_method = "wrapped_#{method}".to_sym
        unless respond_to? old_method
          alias_method old_method, method

          define_method method do |*args|
            send old_method, *args
          end
        end
      end
    end
  end

  def self.included(base)
    base.extend ClassMethods
  end
end

class Foo
  include Bar

  def bar(arg = 'foo')
    puts arg
  end

  wrap :bar
end

Три вопроса:

  1. Есть ли способ сделать это без переименования метода, чтобы разрешить использование super ? Или что-то более чистое / короче?

  2. Есть ли простой способ установить значения по умолчанию?

  3. Есть ли способ переместить вызов wrap: bar вверх?

7
задан fuzzyalej 8 July 2011 в 22:32
поделиться