2017-02-02 3 views
-7

Есть ли способ обернуть все методы, определенные в моем собственном пространстве имен, с фильтром around/before/after, чтобы я мог регистрировать вызовы и неиспользуемые методы?Мониторинг каждого вызова метода в ruby ​​

+1

Этот шаблон обычно называют «аспектно-ориентированным программированием», ищем Ruby, и это должно дать вам множество различных драгоценных камней, которые вы можете использовать, например, Aspector или Aquarium должны делать то, что вы хотите. – Amadan

+3

Возможный дубликат [ Выполнение кода для каждого вызова метода в модуле Ruby] (http://stackoverflow.com/questions/5513558/executing-code-for-every-method-call-in-a-ruby-module) –

ответ

1

Существует довольно много работы, чтобы сделать то, что вы хотите. . К счастью, вы не единственный человек, который хочет, и это было сделано раньше (как я уже говорил в комментариях, в разделе «аспектно-ориентированное программирование»

Вот пример использования Aspector перл:

#!/usr/bin/env ruby 

require 'aspector' 

watcher = Aspector do 
    around(/.*/, except: Object.methods) do |proxy, *args, &block| 
    puts "before #{proxy.name} on #{proxy.receiver}" 
    proxy.call(*args, &block) 
    puts "after #{proxy.name} on #{proxy.receiver}" 
    end 
end 

class Foo 
    def self.klass 
    puts "class method" 
    end 
    def inst 
    puts "instance method" 
    end 
end 

watcher.apply(Foo) 
watcher.apply(Foo, class_methods: true) 
# => before singleton_method_added on Foo 
# after singleton_method_added on Foo 

Foo.klass 
# => before klass on Foo 
# class method 
# after klass on Foo 

Foo.new.inst 
# => before inst on #<Foo:0x007f9b648c83c0> 
# instance method 
# after inst on #<Foo:0x007f9b648c83c0> 
Смежные вопросы