Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I import only a couple of functions from a Ruby module?

Suppose I have a module with the methods : function1,function2,function3. I want to import function1 and function2 but not function3. Is there a way to do this in ruby?

like image 596
Geo Avatar asked Mar 31 '09 12:03

Geo


2 Answers

Not sure if there is a clean way to just add the methods you want, but you can remove the methods that you don't want by using 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
like image 193
Aaron Hinni Avatar answered Sep 19 '22 07:09

Aaron Hinni


Similar solution but a tad more automatic. I have no idea what kind of weird things that can happen though.

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"]
like image 30
sris Avatar answered Sep 19 '22 07:09

sris