Summary
selectively include module methods with Kernel#import
Author and License
Copyright © 2008 Greg Weber, gregweber.info Licensed under the MIT license
Usage
require 'rubygems'
require 'module-import'
module Foo
def foo; 'foo' end
def ; 'bar' end
end
class Importer
import Foo, :bar
end
Importer.new. # => 'bar'
Importer.new.foo # => # NoMethodError
class Importer
import Foo, :not_defined # => #not_defined not found in Foo (ImportError)
end
Giving no methods (or all methods) should behave the same as a normal include
class Importer2
import Foo # same as import Foo, :foo, :bar
end
Importer2.new. # => 'bar'
Importer2.new.foo # => 'foo'
However, there is one important difference. New changes in the included module will not effect the class.
module Foo
undef_method :foo
def ; fail end
end
Importer2.new. # => 'bar'
Importer2.new.foo # => 'foo'
WARNING!
There is no way for Kernel#import to track dependencies between methods! To help with this, by default, all private methods from the module will be imported unless the option :import_private is set to false To write a module that works with this system well, your public methods should depend only on private methods. To use this on someone else’s module, you should either import the full module or write tests or inspect the source code of the module you are importing.
Install
gem install module-import
Source
browser
github.com/gregwebs/module-import/tree/master
repository
git clone git://github.com/gregwebs/module-import.git
Homepage
gregweber.info/projects/module-import.html
RDoc documentation
included with the gem
Notes
Testing
4:1 test:code ratio, I think I have all the corner cases covered. In particular, this does not break inheritance and everything works the same for importing into a module as it does for importing into class.
Implementation
Includes a duplicate of the module that has methods removed