2011-01-25 11 views
17

Mi piacerebbe fare un po 'di magia nel momento in cui istanza e metodi di classe vengono aggiunti ad alcune classi. Quindi ho provato quanto segue:Informazioni su method_added per i metodi delle classi

module Magic 
    def self.included(base) 
    base.extend ClassMethods 
    end 
    module ClassMethods 
    def method_added(name) 
     puts "class method '#{name}' added" 
    end 
    def some_class_method 
     puts "some class method" 
    end 
    end 
end 

class Foo 
    include Magic 
    def self.method_added(name) 
    puts "instance method #{name} added" 
    end 
end 

Questo approccio funziona bene per metodi di istanza, non riesce per metodi di classe. Come posso risolverlo? Eventuali suggerimenti?

risposta

24

siete alla ricerca di singleton_method_added:

module Magic 
    def self.included(base) 
    base.extend ClassMethods 
    end 
    module ClassMethods 
    def method_added(name) 
     puts "instance method '#{name}' added" 
    end 

    def singleton_method_added(name) 
     puts "class method '#{name}' added" 
    end 
    end 
end 

class Foo 
    include Magic 

    def bla 
    end 

    def blubb 
    end 

    def self.foobar 
    end 
end 

uscita:

instance method 'bla' added 
instance method 'blubb' added 
class method 'foobar' added 

Enjoy!

+1

Lifesaver. Grazie! – GeorgieF