2009-03-31 5 views

Respuesta

6

No estoy seguro si hay una manera limpia de simplemente agregar los métodos que desea, pero puede eliminar los métodos que no desee utilizando 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

Tenía en mente algo como esto, pero pensé que quizás existe una manera más limpia. – Geo

5

Solución similar pero un poco más automática. Sin embargo, no tengo idea de qué tipo de cosas raras pueden pasar.

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

Suponiendo controlar el código fuente para el módulo, creo que la manera más limpia sería dividir el módulo en más de, uh, piezas modulares.

Si solo quiere algunas partes de un módulo, es una buena señal de que podría refaccionar ese módulo en múltiples módulos que tienen menos responsabilidad.

Cuestiones relacionadas