2009-03-31 15 views

Répondre

6

Vous ne savez pas s'il existe une méthode propre pour ajouter simplement les méthodes souhaitées, mais vous pouvez supprimer les méthodes que vous ne voulez pas en utilisant 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

Je pensais à quelque chose comme ça, mais je pensais qu'il existait peut-être un moyen plus propre. – Geo

5

Solution similaire mais un peu plus automatique. Je n'ai aucune idée du genre de choses bizarres qui peuvent arriver.

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

En supposant que vous contrôlez le code source au module, je pense que la manière la plus propre serait de diviser le module en morceaux plus, euh, modulaires.

Si vous voulez seulement certaines parties d'un module, c'est un bon signe que vous pouvez refactoriser ce module en plusieurs modules qui ont moins de responsabilités.