On Tue, Jul 12, 2005 at 12:15:30PM +0000, Ingo Blechschmidt wrote: > In Perl 5, %INC maps the partial path names of the modules > loaded to their absolute ones. What should the keys and values > of %*INC be in Perl 6?
Conceptually, the Perl 5 %INC maps from what to which. It also imposes a coupling with the filesystem which makes things like require $module awkward. The hook mechanism in values breaks consistency, unless you think of string values as shorthand for sub { slurp "path" }. I propose to throw away the filesystem coupling, and map from a more general name of the bit of code we are requiring to a more general description of which instance of it we actually got. Once modules return interesting values, it might be useful to keep a copy of that value somewhere on the value side of %*INC: or else turn it inside out and stipulate that a standard field in the Module object is where you got this particular module. Probably, %*INC values should be weak references. On the key side, I think we should allow more than just strings. `use Bar` and `require Bar` invoke the module loader on a ModuleName.new("Bar"). Passing a straight string performs this promotion automatically. Path separators and '.pm' need never seen outside the module loader. You can also ask to use/require a File or a URI, but those requests are only honored if you have appropriate entries in the module search path. In the case of URIs we could allow, for example, only modules from a particular domain or even under a particular path. Examples: %*INC = ( # weak references ModuleName.new("Bar") => Module.new(name => "Bar", version => "0.0.7", author => "BarCom", path => "/usr/lib/perl6/Bar.pm", loaded_classes => (::Bar, ::Bar::Internals), ), URI.new("http://codeIZus.com/perl/randommodule.cgi") => Module.new(name => "Acme::emcA", ...), $an_open_file => ... ); @*INC = ("/usr/local/lib/perl6", URI.new("http://codeIZus.com/perl/"), URI.new("http://"), # this would mean allow loading code from ANYWHERE. ); -- Gaal Yahas <[EMAIL PROTECTED]> http://gaal.livejournal.com/