Для методов экземпляра существует метод Object::method_added(name)
, который вы можете переопределить, аналогично используемому вами «унаследованному»:
class test
def self.method_added(name)
puts "method_added(#{name.inspect})"
super
end
end
irb(main):002:0> class Child < Test; def foo; end; end
method_added(:foo)
=> nil
Затем вы можете сравнить полученное имя со списком ваших методов:
Test.instance_methods.include?(name.to_s)
При использовании методов класса этот подход не работает (даже если вы делаете такие вещи, как class << self
магия), но помощник знал ответ: http://www.ruby -forum.com / topic /120416 :
class Test
def self.singleton_method_added(name)
puts "Class method added #{name.inspect}"
end
end
Это только первая часть проблемы, потому что вам нужно знать, какой класс определил метод (он будет сам) и является ли метод новым, илипереопределенныйЭксперимент с этим кодом:
class Test
def self.singleton_method_added(name)
if self == Test
puts "My own class method added: #{self.name}.#{name.inspect}"
elsif Test.methods(false).include?(name.to_s)
puts "Class method overriden: #{self.name}.#{name.inspect}"
elsif Test.methods(true).include?(name.to_s)
puts "My parent's class method overriden: #{self.name}.#{name.inspect}"
else
puts "New class method added: #{self.name}.#{name.inspect}"
end
end
end