module-import

- selectively include module methods

Summary

selectively include module methods with Kernel#import

Author and License

Copyright (c) 2008 Greg Weber, gregweber.info Licensed under the MIT license

Usage

              require 'rubygems'
              require 'module-import'
            
              module Foo
                def foo; 'foo' end
                def bar; 'bar' end
              end
            
              class Importer
                import Foo, :bar
              end
              Importer.new.bar # => '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 # => '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 bar; fail end
              end
              Importer2.new.bar # => '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