Hi all,
There have been a few threads recently both here and on the Rails list
where the problem of namespace collisions has come up. It seems to my
untutored eye that they’ve come about simply because the original
authors didn’t apply their namespacing universally. From memory, an
example is htmltools and ActionPack both defining an HTML::Tag class.
A possible solution sprung to mind: how does the following syntax look?
require ‘foo’, :into => ‘Bar’
require ‘qux’, :into => ‘Wibble::Spang’
What that would do is require the named file such that all its code was
executed in the context of the named module. My meta-fu isn’t quite up
to giving even a simple example, but I’d envisage the result looking
something like this:
$ cat bar.rb
class Bar
end
$ cat test.rb
require ‘bar’, :into => ‘Foo’
p Foo.constants
$ ruby test.rb
[“Bar”]
With the htmltools and ActionPack example, this:
require ‘htmltools’, :into => ‘MyHtmltoolsModule’
require ‘actionpack’, :into => ‘MyCollisionModule’
would result in MyHtmlToolsModule::HTML::Tag and
MyCollisionModule::HTML::Tag existing side-by-side.
Would this require help from the interpreter? require and load both
execute the code at the top level of the namespace (unless I’ve missed
something) and without overloading them to actually eval() the code
differently, I’m not sure what’s best.
Any thoughts? Has this been discussed to death before my time? Is it
obviously stupid?
It’s just struck me that if we’re getting help from the interpreter
anyway, this might be possible:
require ‘foo’ into Bar
which I think is quite neat. In case I haven’t quite made it clear, the
main advantage I can see from this is that modules can be protected from
each other without the original author needing to care how their module
is going to be used, and it can be retrospectively applied to existing
code (give or take any meta- or cleverer-than-me-programming that makes
this void, of course ) to fix exactly the sort of collision problems
that are already occurring.