2010-11-16 18 views

Antwort

4

Soweit ich weiß, gibt es nichts genau wie das, was Sie beschreiben. Wie können Sie jedoch Ihre eigenen erstellen, mit Class::inherited.

module MyModule 
    def self.class_added(klass) 
    # ... handle it 
    end 
    class ::Class 
    alias_method :old_inherited, :inherited 
    def inherited(subclass) 
     MyModule.class_added(subclass) if /^MyModule::\w+/.match subclass.name 
     old_inherited(subclass) 
    end 
    end 
end 

module MyModule 
    # now add classes 
end 
+0

Ja, das Patchen Methoden der Klasse ihre eigenen Probleme haben. Insbesondere wird vererbt für keine Klasse aufgerufen, die einen eigenen Callback definiert und Super nicht aufruft. Die Alternative besteht darin, den Syntaxbaum mit Paraetre zu ändern (in letzter Zeit allerdings noch nicht 1.9). Aber es scheint, dass die Rückrufe fehlen. Ich habe gefragt, weil Gregors Beitrag ziemlich alt ist, und die Dokumente erwähnen solche Funktion nicht. –

1

Sie könnten versuchen, diesen Ansatz, indem Sie Ihre eigene def_class Methode definieren:

module M 
    def self.const_missing(name) 
    const_set(name, Class.new) 
    end 

    def self.def_class(klass, &block) 
    class_added(klass.name) 
    klass.class_eval(&block) 
    end 
end 

module M 
    def self.class_added(klass) 
    puts "new class added: #{klass}" 
    end 

    def_class Hello do 
    def hello 
     puts "hello!" 
    end 
    end 
end 

h = M::Hello.new.hello #=> "hello!" 
+0

Es ist ein guter Hack. Mit Parse Tree Hack ist es sogar möglich, dies zu tun, ohne dass die Benutzer ihre eigenen Module ändern müssen. Aber Parse Tree Hacks werden einen anderen Bereich einführen. Oder führen Sie eine andere benutzerdefinierte modulähnliche Methode ein. Nicht perfekt. Ich weiß, dass Matz nicht mehr Callbacks hinzufügen wollte, aber einige fehlen wirklich. –

Verwandte Themen