Я собираюсь украсть пример из Delegate.rb , он ограничивает то, что включает
...
class Delegator < BasicObject
kernel = ::Kernel.dup
kernel.class_eval do
[:to_s,:inspect,:=~,:!~,:===,:<=>,:eql?,:hash].each do |m|
undef_method m
end
end
include kernel
...
становится
module PreciseInclude
def include_except(mod, *except)
the_module = mod.dup
the_module.class_eval do
except.each do |m|
remove_method m # was undef_method, that prevents parent calls
end
end
include the_module
end
end
class Foo
extend PreciseInclude
include_except(SimpleTask, :task1, :task2)
end
Foo.instance_methods.grep(/task/) => [:task3]
вы всегда можете перевернутьвместо включения он становится include_only
Уловка в том, что remove_method не будет работать для вложенных модулей, а использование undef предотвратит поиск во всей иерархии этого метода.