This module adds explicit imports to Ruby. By calling the
import method during class or module definition, all constants in the module's namespace will be replaced by placeholders, except a few core types and those that are explicitly imported. For example, in this class:
class Joe import 'File' def file_exists?(path) File.exists?(path) end def create_queue Queue.new end end
the File module will be available:
>> Joe.new.file_exists?('/') => true
But other constants, like Queue, won't be:
>> Joe.new.create_queue NoMethodError: undefined method `new' for #<ExplicitImport::CantTouchThis:0x10135a8c0>
As you can see, the constants are present, but have placeholder values:
>> Joe.const_get(:Queue) => #<ExplicitImport::CantTouchThis:0x10135a8c0>
That's unfortunate. I have an idea about how to make them actually throw a NameError, though it's pretty evil.
Minimal. You almost certainly don't want to use this as it exists right now. For one thing, it only isolates the module from constants defined before the module itself; subsequent constant definitions will be missed.
There are probably ways to fix that. Patches are welcome if this kind of thing tickles your fancy.