From: "Benjamin J. Tilly" Date: 2001-04-25T06:12:40+09:00 Subject: [ruby-talk:14177] Re: RCR, strange things in $: matz@zetabits.com (Yukihiro Matsumoto) wrote: >Hi, > >In message "[ruby-talk:14102] Re: RCR, strange things in $:" > on 01/04/24, Dave Thomas writes: > >|> Back to the point. I think that it would be handy to have >|> a single hook where you can programatically give Ruby >|> something and have it load it as a module. Useful things >|> can be built on that hook. Dangerous things can also be >|> built on that hook. We can argue against the dangerous >|> things while letting people experiment with potentially >|> useful ones... >| >|Add to the wish the ability to have versioning at that interface. > >Hmm, both loading from zip archive and versioning are intersting. >I'd like to see bit more detailed proposal to start up active >discussion. As both versioning and loading from a zip archive are experimental, how about making both of them just hooks? require can accept a list of arguments. The first is the name of the library. The rest are optional (but theoretically will be versioning information.) When loading a library, each element in $: is searched. If it has a load_library method, that is called with the name of the file being searched for. It returns one of three things. If it gives back false, that library was not loaded. If it gives back true, that library was found and loaded successfully, but there is no versioning implemented in the load. If it gives back something else, that something is a closure. If the element in $: does not have a load_library method, it should be a string, and that string will go through a default load_library implementation that searches a directory, loads the file if it is found, and hands back whether or not the library was found. When loading a library that was already loaded, if true was given back before, nothing is done. Otherwise the closure is called with the new version information for an (optional) version check. The planned future change is that at some point a choice will be made among the (hopefully) competing versioning implementations that people have tried, and that will be made available as a core module that can be easily included in custom loading schemes, plus the default method for a string in $: will incorporate that. Hopefully the proposed hooks will not be much work for matz, and will have enough flexibility for the things that people want to try. Cheers, Ben PS Yes, I do hate making decisions up front. :-)