Перехват метода Ruby

Я хочу перехватывать вызовы метода в классе ruby ​​и иметь возможность делать что-то до и после фактического выполнения метода. Я попробовал следующий код, но получил ошибку: say_hello 'для класса HomeWork' (NameError) from (eval): 2: in `before_filter '

Кто-нибудь может помочь мне сделать это правильно?

class MethodInterception

  def self.before_filter(method)
    puts "before filter called"
    method = method.to_s
    eval_string = "
      alias_method :old_#{method}, :#{method}

      def #{method}(*args)
        puts 'going to call former method'
        old_#{method}(*args)
        puts 'former method called'
      end
    "
    puts "going to call #{eval_string}"
    eval(eval_string)
    puts "return"
  end
end

class HomeWork < MethodInterception
  before_filter(:say_hello)

  def say_hello
    puts "say hello"
  end

end
5
задан elasticsecurity 23 September 2010 в 14:30
поделиться