2009-03-31 8 views

risposta

6

Non sono sicuro se c'è un modo pulito per aggiungere solo i metodi desiderati, ma è possibile rimuovere i metodi che non si desidera utilizzando undef_method.

module Foo 
    def function1 
    end 

    def function2 
    end 

    def function3 
    end 
end 

module MiniFoo 
    include Foo 
    not_wanted_methods = Foo.instance_methods - %w(function1 function2) 
    not_wanted_methods.each {|m| undef_method m} 
end 

class Whatever 
    include MiniFoo 
end 
+0

Avevo in mente qualcosa di simile, ma pensavo che forse esistesse un modo più pulito. – Geo

5

Soluzione simile ma un po 'più automatica. Non ho idea di che tipo di cose strane possa accadere però.

module Foo 
    def m1 
    puts "Hello from m1" 
    end 

    def m2 
    puts "Hllo from m2" 
    end 
end 

class Module 
    alias :__include__ :include 
    def include(mod, *methods) 
    if methods.size > 0 
     tmp = mod.dup 
     new_mod = Object.const_set("Mod#{tmp.object_id}", tmp) 
     toremove = new_mod.instance_methods.reject { |m| methods.include? m.to_sym } 
     toremove.each { |m| new_mod.send(:undef_method, m) } 
     __include__(new_mod) 
    else 
     __include__(mod) 
    end 
    end 
end 

class Bar 
    include Foo 
end 

class Baz 
    include Foo, :m2 
end 

bar = Bar.new 
baz = Baz.new 
p bar.methods - Object.methods 
p baz.methods - Object.methods 

=> 

["m1", "m2"] 
["m2"] 
4

Supponendo di controllare il codice sorgente per il modulo, penso che il modo più pulito sarebbe quello di dividere il modulo in per uh, pezzi di più, modulari.

Se si desidera solo alcune parti di un modulo, è un buon segno che è possibile rifattorizzare quel modulo in più moduli che hanno meno responsabilità.