如何使用aspector gem来包装类方法?

时间:2015-08-27 15:17:12

标签: ruby aop

我使用ruby aspector gem来做一些代码检测,但除了实例方法之外我还需要检测类方法。当我运行下面的代码时,我得到了

  

Foo.bar(巴兹)

但我期待

  

使用result =>执行Foo.bar Foo.bar(巴兹)

     

Foo.bar(巴兹)

如何获得预期结果?

require 'aspector'
class Foo
  def self.bar(msg)
    "Foo.bar(#{msg})"
  end
end

class FooAspect < Aspector::Base
  around :bar, method_arg: true do |method, proxy, *args, &block|
    name = "#{self.class}.#{method}"
    result = proxy.call(*args, &block)
    warn "#{name} executed with result => #{result}"
    result
  end
end
FooAspect.apply(Foo)
puts Foo.bar("baz")

1 个答案:

答案 0 :(得分:3)

Aspector中的文档很差,但您可以随时转到spec/functionals并尝试找到解决方案。

关于你的案子。在应用您的方面时,只需使用class_methods: true选项:

FooAspect.apply(Foo, class_methods: true)

完整代码列表:

require 'aspector'

class Foo
  def self.bar(message)
    puts message
  end
end

class FooAspect < Aspector::Base
  around :bar, method_arg: true do |method, proxy, *args, &block|
    puts 'start'
    proxy.call(*args, &block)
    puts 'end'
  end
end

FooAspect.apply(Foo, class_methods: true)
Foo.bar('execute')
=> start
=> execute
=> end