Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-10 Thread Bennett Todd

2000-08-09-21:00:31 Chaim Frenkel:
 Making a module local to the using package, might have interesting
 properties. [...]
 The only breakage that I see, is having some way of globally setting
 a variable. For example, turning on debugging for all uses. (FTP::Debug
 I find quite popular.)
 
 Can anyone see any other breakage? 

Not other breakage, but another example of the same exact class
of breakage. In RFC 70 I proposed some (hopefully minor) language
cleanups to make it possible to have Fatal.pm actually work the
way people want it. If it worked, then Fatal.pm would be getting
some categories it supported, e.g. "use Fatal qw(:io);". I then
suggested that the invoked categories could be posted into a
testable variable, in case other module authors wished to cooperate
with this protocol.

If the only real problem that can be found with making module use
package-local is in these few option-flag type variables, perhaps
they could be handled differently. E.g. suppose normal package
variables end up being local to the package that "use"-es the
package, and when a package actually wants to make a genuine global
for all users of the package, it explicitly tucks it into a variable
whose name starts with main::. E.g. let Net/FTP.pm post its debug
flag into $main::Net::FTP::Debug, and the list of exception classes
requested of Fatal.pm could be posted into @main::Fatal.

The next natural thought seems to be that the module creating such
a global should check and see if it's being used by main, and
only post into the global if so, otherwise let its option[s] be
user-local. Can import() use caller() this way? That would allow
a module author to e.g. code their module using Fatal, without
affecting anything outside their module, while allowing main's
invocation (if any) of Fatal to offer guidance to other modules that
chose to try and honor it.

-Bennett

 PGP signature


Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-10 Thread Bennett Todd

2000-08-09-17:33:25 Steve Simmons:
 If that's the intent, then yes, author name must become part of the
 package identifier.  Rather than change the meaning of "ref $object"
 unexpectedly, I'd add one or more alternate forms of ref.  Off the
 top of the head, something like
 
 ( $version, $class ) = vref $object;  # ref with version
 ( $author, $class ) = aref $object;   # ref with author
 ( $version, $author, $class ) = fref $object;   # get all

Rather than proliferating the number of keywords eaten with all
these *ref varients, this sounds like a useful place for returning
an object with a default stringification of the class:

$class = ref $object; # when you use $class as a string,
  # or 2nd arg to bless()
$version = $class-{VERSION};
$author = $class-{AUTHOR};

Ref RFC 37, RFC 73.

-Bennett

 PGP signature


Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-10 Thread Steve Simmons

On Wed, Aug 09, 2000 at 05:53:44PM -0400, Ted Ashton wrote:

 I'll take that as my cue ;-).

Ah, nothing like a man who knows when to pick up his cues.

 *shudder*  This whole business is getting pretty scary . . .
  [[ discussion of ugly implicatations elided ]]

The short answer is that (assuming I understand Larry's statement)
he'd like these issues addressed.  If the resulting `best' answer
is so complex and so ugly that he decides it's a bad idea, that's
fine -- but (if I recall correctly) tcl has addressed this problem
and come up with workable solutions.  I'm not intimately familiar
with them, but will get so.



Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-10 Thread Ted Ashton

Thus it was written in the epistle of Steve Simmons,
 On Wed, Aug 09, 2000 at 05:53:44PM -0400, Ted Ashton wrote:
 
  I'll take that as my cue ;-).
 
 Ah, nothing like a man who knows when to pick up his cues.

:-)

  *shudder*  This whole business is getting pretty scary . . .
   [[ discussion of ugly implicatations elided ]]
 
 The short answer is that (assuming I understand Larry's statement)
 he'd like these issues addressed.  If the resulting `best' answer
 is so complex and so ugly that he decides it's a bad idea, that's
 fine -- but (if I recall correctly) tcl has addressed this problem
 and come up with workable solutions.  I'm not intimately familiar
 with them, but will get so.

Understood.  After a bit of reflection on it, I got to wondering, what if it
  1) Searched all of @INC for the most recent module which fits within the 
 constraints given (version range numbers, at least).
  2) Loaded the module globally (as it does now) *unless* told not to.  Thus,
 if a module wanted to
   use Foo private;
 then it could.
As far as the author business goes, is it becoming unwieldy to have portions
of the namespace assigned to specific authors?  That is, Devel::SmallProf is 
mine (as per committee decision) and others wanting to write small profilers
can have TinyProf, MicroProf and so forth.  I really think that multiple 
versions of a module are a fairly natural thing, but that modules with the
same name by different folks are bound to cause confusion, much beyond the 
actual running of programs.  

  PerlUserA:  I keep having this problem with the Foo::Bar module.  It won't
grok blargs as it ought.
  PerlUserB:  You must be doing something wrong.  It works fine for me.
*three day conversation ensues*
  PerlUserB:  I give up.  I don't know what you're doing wrong.  Why don't you
write to Tom and ask him.
  PerlUserA:  Tom, why Tom?
  PerlUserB:  Because he wrote the module.
  PerlUserA:  No he didn't.  Ilya wrote it.

Ted
-- 
Ted Ashton ([EMAIL PROTECTED]), Info Sys, Southern Adventist University
  ==   
It is not knowledge, but the act of learning, not possession but the act of
getting there, which grants the greatest enjoyment. When I have clarified
and exhausted a subject, then I turn away from it, in order to go into
darkness again; the never-satisfied man is so strange if he has completed a
structure, then it is not in order to dwell in it peacefully, but in order
to begin another. I imagine the world conqueror must feel thus, who, after
one kingdom is scarcely conquered, stretches out his arms for others.
   -- Gauss, Karl Friedrich (1777-1855)
  ==   
 Deep thoughts to be found at http://www.southern.edu/~ashted



Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-10 Thread Steve Simmons

On Thu, Aug 10, 2000 at 11:01:39AM -0400, Bennett Todd wrote:

 Rather than proliferating the number of keywords eaten with all
 these *ref varients, this sounds like a useful place for returning
 an object with a default stringification of the class:
  . . .
 Ref RFC 37, RFC 73.

I have no problem with this or any other solution that gets the
data back.  I'll add a comment to RFC78 that should those RFCs
prevail, we'll follow them.

For the record, I prefer hashes for that sort of thing too.  But
perl has traditionally done ordered list returns, and I followed in
that vein.



Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-10 Thread Dan Sugalski

At 10:43 AM 8/10/00 -0400, Bennett Todd wrote:
2000-08-09-21:00:31 Chaim Frenkel:
  Making a module local to the using package, might have interesting
  properties. [...]
  The only breakage that I see, is having some way of globally setting
  a variable. For example, turning on debugging for all uses. (FTP::Debug
  I find quite popular.)
 
  Can anyone see any other breakage?

Not other breakage, but another example of the same exact class
of breakage. In RFC 70 I proposed some (hopefully minor) language
cleanups to make it possible to have Fatal.pm actually work the
way people want it. If it worked, then Fatal.pm would be getting
some categories it supported, e.g. "use Fatal qw(:io);". I then
suggested that the invoked categories could be posted into a
testable variable, in case other module authors wished to cooperate
with this protocol.

Why not, then, introduce non-fatal errors and a new keyword to throw them? 
Something like quit(), which could take an error class, an error identifier 
(a number or short string or something) and a message. It'd work like a 
bare return, but also stick something in $@, and could be trappable. (Quit 
with one parameter would default the class to generic, and the identifier 
to unknown)

This way, when something needs to bail with a non-fatal error it could:

   quit('io', 'READERROR', "Unable to read from file $foo");

and the code calling the sub could, if it wanted, could do a plain:

   $foo = some_sub($file);

or:

   {
 use fatal;
 eval {
   $foo = some_sub($file);
 };
 if ($@) {
   if ($@-nonfatal) {
 # handle non-fatal errors
   }
 }
   }

or something like that.

*) Define a set of c

Dan

--"it's like this"---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




RE: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-10 Thread Brust, Corwin



-Original Message-
From: Steve Simmons [mailto:[EMAIL PROTECTED]]

 For the record, I prefer hashes for that sort of thing too.  But
 perl has traditionally done ordered list returns, and I followed in
 that vein.

Perhaps Damian's want() (RFC 21) can be used to allow allow either return
type? 

Assuming that's adopted, of course.

-Corwin



Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-10 Thread Dan Sugalski

At 05:46 PM 8/10/00 +0100, Graham Barr wrote:
On Thu, Aug 10, 2000 at 12:28:05PM -0400, Dan Sugalski wrote:
  No, it wouldn't, really. We could make "use fatal;" scoped, so that the
  quit op (or whatever it is) only jumps through all its hoops if the
  pragma's in effect. If its not, then quit(foo, bar, baz) does a bare 
 return
  and that's it.
 
  You'd have the overhead of checking a flag when actually quitting with an
  error, but that adds a very small amount of overhead to an exceptional 
 case.

Why not make that flag avaliable instead of having a new op ?

The user can then write

   $^fatal ? die  : return;

Sure, that works. Whatever keyword throws the non-fatal error might just be 
a perl sub that does exactly that, at least to start. (Maybe always, who knows)

Hm, although people may start to mis-use the flag.

What, people misuse core functionality? I can't picture *that* happening. 
It's so unperlish... :)

Dan

--"it's like this"---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-10 Thread Steve Simmons

 Perhaps Damian's want() (RFC 21) can be used to allow allow either return
 type? 

Yes indeed.

 Assuming that's adopted, of course.

Sure looks to me like a good idea; I hope it does.



Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-10 Thread Chaim Frenkel

I'd put it into 

Perl::Option{__Package__} 

There was some talk about making Perl:: special. So that might be the one
and only truely global space.

Hmm, that wouldn't work with multiple versions without cooperation.

Alternatively, we could treat a set 

Perl::Option{FTP::Net}-Debug = 255;

as a method call, and have the package determine it's caller.

chaim

 "BT" == Bennett Todd [EMAIL PROTECTED] writes:

BT If the only real problem that can be found with making module use
BT package-local is in these few option-flag type variables, perhaps
BT they could be handled differently. E.g. suppose normal package
BT variables end up being local to the package that "use"-es the
BT package, and when a package actually wants to make a genuine global
BT for all users of the package, it explicitly tucks it into a variable
BT whose name starts with main::. E.g. let Net/FTP.pm post its debug
BT flag into $main::Net::FTP::Debug, and the list of exception classes
BT requested of Fatal.pm could be posted into @main::Fatal.

-- 
Chaim FrenkelNonlinear Knowledge, Inc.
[EMAIL PROTECTED]   +1-718-236-0183



Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-10 Thread Graham Barr

On Thu, Aug 10, 2000 at 10:43:02AM -0400, Bennett Todd wrote:
 If the only real problem that can be found with making module use
 package-local is in these few option-flag type variables, perhaps
 they could be handled differently. E.g. suppose normal package
 variables end up being local to the package that "use"-es the
 package, and when a package actually wants to make a genuine global
 for all users of the package, it explicitly tucks it into a variable
 whose name starts with main::. E.g. let Net/FTP.pm post its debug
 flag into $main::Net::FTP::Debug, and the list of exception classes
 requested of Fatal.pm could be posted into @main::Fatal.

And the difference is ?

$ perl -e 'warn \$main::fred::x," ",\$fred::x'
SCALAR(0x80dc254) SCALAR(0x80dc254) at -e line 1.

Graham.



Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-10 Thread Bennett Todd

2000-08-10-17:36:41 Graham Barr:
 And the difference is ?
 
 $ perl -e 'warn \$main::fred::x," ",\$fred::x'
 SCALAR(0x80dc254) SCALAR(0x80dc254) at -e line 1.

Today there's no difference. If the proposal under discussion were
to pass, and packages' namespaces were to become local to the
namespace where the "use" occurred, then perhaps main::whatever
could be a common, stable, global that they could use for these rare
variables that really need to be common from multiple invokers.

-Bennett

 PGP signature


Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-09 Thread Dan Sugalski

At 10:44 AM 8/9/00 -0700, Larry Wall wrote:
[EMAIL PROTECTED] writes:
: Note that it may not be possible to satisfy conflicting requests.  If
: module CA and module CB demand two different versions of the same
: module CC, the compiler should halt and state the module conflicts.

Pardon me for sniping at a great RFC, but I already promised the CPAN
workers that I'd make that last statement false.  There's no reason in
principle why two modules shouldn't be allowed to have their own view
of reality.  Just because you write Foo::bar in your module doesn't mean
that Perl can't know which version of Foo:: you mean.

Does that mean, then, that when module A does a "$C::bar = 1" it affects a 
different package namespace than module B doing a "$C::bar = 2"? And does 
it also extend to things like this:

package A;
use C 1.2;
package B;
use C 1.4;

where two packages in the same file use different versions of module C and 
get them?

Dan

--"it's like this"---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-09 Thread Dan Sugalski

At 11:11 AM 8/9/00 -0700, Larry Wall wrote:
Dan Sugalski writes:
: Does that mean, then, that when module A does a "$C::bar = 1" it affects a
: different package namespace than module B doing a "$C::bar = 2"?

Presumably.

H. That brings up some issues of ambiguity, then. If you use C in 
package A, and also in package B, which do you see when you're in main and 
access $C::bar?

: And does it also extend to things like this:
:
: package A;
: use C 1.2;
: package B;
: use C 1.4;
:
: where two packages in the same file use different versions of module C and
: get them?

I expect that could also be made to work, provided the semantics of
importation remain package-scoped and don't become lexically scoped.

Sure. They'd have to be, otherwise packages split across different files 
would get a rather bizarre view of the world. This sort of means we'll need 
some sort of two-level stash, one per-package and one global. (Unless 
you're outlawing symbolic references... :)

To me, it really just means that the *real* name of the package includes
the implementation (author?) and version, but that when you say

 use C;

you're just choosing to wildcard both the implementation and version.
This view says that we probably ought to figure out how to encode the
implementation and version syntactically as part of the package name,
rather than as a 3rd argument to use.

Yup. I can see the build procedures needing to know this too, since we'll 
probably need to give modules with shared libraries unique names. Some 
platforms (OS/2 and VMS, at least) will need that, as they get cranky if 
you try and load shareables with the same base filename.

Think about the long names of fonts for an example of how far this
can be taken.

Would this be "Taken to its logical and sensible conclusion" or "Taken as 
far as it can possibly go, though it you turn around and look *really* hard 
with binoculars you can see where you crossed the line, way back there by 
the horizon"?

Dan

--"it's like this"---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-09 Thread Steve Simmons

On Wed, Aug 09, 2000 at 10:44:03AM -0700, Larry Wall wrote:

 : Note that it may not be possible to satisfy conflicting requests.  If
 : module CA and module CB demand two different versions of the same
 : module CC, the compiler should halt and state the module conflicts.

 Pardon me for sniping at a great RFC . . .

No problem, I don't feel sniped at.

  . . . but I already promised the CPAN
 workers that I'd make that last statement false.  There's no reason in
 principle why two modules shouldn't be allowed to have their own view
 of reality.  Just because you write Foo::bar in your module doesn't mean
 that Perl can't know which version of Foo:: you mean.

Near the end of the RFC this topic does come up; see it directly at
http://www.nnaf.net/~scs/Perl6/RFC78.html#Alternative_Idea_Module_Versio.
That section was much longer in my unreleased drafts, but did include
some discussion on disambiguation when multiple versions of the same
module are loaded.  In the RFC I wrote off this idea with ``In This Way
Lies Madness, but perl has done stranger things.''

If we want to open that can of worms I'm willing to pitch in.  I'll even
continue on with the task of maintaining the RFC, or starting another
if appropriate.  But I'd barely started thinking about this issue with
respect to perl until a couple of days ago, so folks who are much more up
to speed on language/inheritence/etc are going to have to carry the load.

Turning back to some specific comments made by Larry and by Dan Sugalski:

LW The larger view of it is how to support package aliasing.  A package
LW name is essentially the name of a public interface.  Suppose you
LW have one interface, but two or more different implementations of
LW that interface by different people.  Each might have their own
LW version sequence.

Package aliasing should certianly be allowed; the RFC already contains
a suggestion for it:

use foo 3.0 as foo_old;
use foo =3.0. as foo;
use foo 3.0. as new_foo;

Using the alias gets you what you need.

Your comment above implies that CPAN may (will be allowed to) contain
modules of the same name and same version by different authors.  Is this
correct?  If so (shudder), what happens currently when both are installed?
I presume one simply overwrites some or all of the other.

If that's the intent, then yes, author name must become part of the
package identifier.  Rather than change the meaning of "ref $object"
unexpectedly, I'd add one or more alternate forms of ref.  Off the
top of the head, something like

( $version, $class ) = vref $object;  # ref with version
$version = vref $object;  # scalar context gets version
( $author, $class ) = aref $object;   # ref with author
$author = aref $object;   # scalar context gets author
( $version, $author, $class ) = fref $object;   # get all
# Scalar context gets a string suitable for select the
# exact object in use
$fq_name = fref $object;

if ( $fqname eq fref $other_object )...

LW Another question is whether the two different versions of the "same"
LW module are going to stomp on each other?  (Not in package space, since
LW the packages are distinguished internally, but how about in the
LW filesystem?)

If we include author name along with the version number in the file system
namespace (gawd, I can't believe I just wrote that), then clobbering
won't happen.  IMHO this feature is no more difficult to add to the
install process than adding version numbers; it implies tho that we
need a $AUTHOR var in all modules and to allow for it in module `version'
specifications.  Again, off the top of the head, we could allow a string
(any string that would not be confused with a version number) to indicate
the author:

use foo CONWAY =1.3  as foo_good;
use foo GATES   1.3  as foo_bad;
use foo * as foo_desperate;

As long as there's no author names `as', we're cool.  I suspect the
proposed syntax in the RFC could be extended to handle this unambiguously
both for run/compile-time module naming and for installation, but need
to think it thru.

DS Does that mean, then, that when module A does a "$C::bar = 1" it
DS affects a different package namespace than module B doing a
DS "$C::bar = 2"?

LW Presumably.

Yes, that's how I'd see it too.  Which creates a real problem for
modules which do things like

package foo;

{
my $hidden_var;

sub new {
if ( $hidden_var ) {
do x;
} else {
do y;
}
}
}

Now there are two copies of $hidden_var while the module clearly expects
only one.  Either this kind of construction will have to be avoided,
or some mechanism developed which allows multiple version of a module
to somehow share important data which is otherwise hidden by such tricks.

IMHO, module authors should be able to forbid multi-loads across
sufficiently different versions of the module (ie, all 

Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-09 Thread Dan Sugalski

At 01:50 PM 8/9/00 -0700, Larry Wall wrote:
Dan Sugalski writes:
: At 11:11 AM 8/9/00 -0700, Larry Wall wrote:
: Dan Sugalski writes:
: : Does that mean, then, that when module A does a "$C::bar = 1" it 
affects a
: : different package namespace than module B doing a "$C::bar = 2"?
: 
: Presumably.
:
: H. That brings up some issues of ambiguity, then. If you use C in
: package A, and also in package B, which do you see when you're in main and
: access $C::bar?

I dunno.  I don't imagine the situation will arise that often.

It'll happen at least once.

I suppose we could go insane and make packages loaded in through modules 
completely invisible to all but the use-ing package, so in this case main 
wouldn't even know there was a C loaded, and if it tries to mess with 
things in the C package it gets its own empty stash to deal with. (Which 
all other packages that didn't use one version of the module or another get)

I suppose that's a fancy way of saying namespaces created by used modules 
are private to the package using them. (Though that still leaves the issue 
of what happens when package B uses something from package C which wasn't 
created on the use, but then I'd probably just say "you get your version of 
C. Nyah!")

Dan

--"it's like this"---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-09 Thread Ted Ashton

Thus it was written in the epistle of Steve Simmons,

   . . . but I already promised the CPAN
  workers that I'd make that last statement false.  There's no reason in
  principle why two modules shouldn't be allowed to have their own view
  of reality.  Just because you write Foo::bar in your module doesn't mean
  that Perl can't know which version of Foo:: you mean.
 
 OK, let's let someone else get into the conversation.

I'll take that as my cue ;-).

 DS . . . If you use C in package A, and also in package B, which do you
 DS see when you're in main and access $C::bar?
 
 LW I dunno.  I don't imagine the situation will arise that often.
 
 It may not happen often, but once is enough.  IMHO the answer is `in load
 order' unless the programmer does something explicit to resolve the
 issue.

*shudder*  This whole business is getting pretty scary.  Best that I can 
tell, what y'all are saying is that if A and B happen to both load the same
version of C, then A can say $C::flag = 1 and B can see that, but if they 
load differing versions, then they can't (as there are two copies of $C::flag).
Oi!  If you are going to split it up in that fashion, I would think that you
would have to go all the way.  No matter what version is available, every
load of a package from another package is private to that package.  A has it's
mirage of C and B has it's mirage of C, even if they loaded the same version,
and main has no access to either.

I happen to have a profiler out there which uses the DB package.  What happens
if someone loads SmallProf and DProf and the perl debugger all at once?

Ted
-- 
Ted Ashton ([EMAIL PROTECTED]), Info Sys, Southern Adventist University
  ==   
Mathematics is not only real, but it is the only reality. That is that
entire universe is made of matter, obviously. And matter is made of
particles. It's made of electrons and neutrons and protons. So the entire
universe is made out of particles. Now what are the particles made out of?
They're not made out of anything. The only thing you can say about the
reality of an electron is to cite its mathematical properties. So there's a
sense in which matter has completely dissolved and what is left is just a
mathematical structure.
   -- Gardner, Martin
  ==   
 Deep thoughts to be found at http://www.southern.edu/~ashted



Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-09 Thread Bart Lateur

On 9 Aug 2000 15:03:40 -, Perl6 RFC Librarian wrote:

Improved Module Versioning And Searching

[About loading different versions of a module at the same time]

The whole thing sounds whacky to me.

I don't really mind that @INC is searched for the most recent version of
a module, but otherwise, my solution would be simple: authors that don't
provide complete backward compatibility with older versions of the same
module, safe the bugs, and safe beta versions, should be kicked of CPAN.

 ;-)

(I wouldn't dare...)

-- 
Bart.



Re: RFC 78 (v1) Improved Module Versioning And Searching

2000-08-09 Thread Chaim Frenkel

Let's not throw this out completely. Let's explore the possiblities.

Making a module local to the using package, might have interesting
properties.

The only items of interest are the globals. And by making them visible
(or a version visible) to the use-ing module, two modules can get
different behaviours without stomping on each other.

All the isolation that we're developing for threads would help this out.

So the used package's globals can be lexically scoped in the user.

The only breakage that I see, is having some way of globally setting
a variable. For example, turning on debugging for all uses. (FTP::Debug
I find quite popular.)

Can anyone see any other breakage? 

chaim

 "DS" == Dan Sugalski [EMAIL PROTECTED] writes:

DS It'll happen at least once.

DS I suppose we could go insane and make packages loaded in through modules 
DS completely invisible to all but the use-ing package, so in this case main 
DS wouldn't even know there was a C loaded, and if it tries to mess with 
DS things in the C package it gets its own empty stash to deal with. (Which 
DS all other packages that didn't use one version of the module or another get)

DS I suppose that's a fancy way of saying namespaces created by used modules 
DS are private to the package using them. (Though that still leaves the issue 
DS of what happens when package B uses something from package C which wasn't 
DS created on the use, but then I'd probably just say "you get your version of 
DS C. Nyah!")


-- 
Chaim FrenkelNonlinear Knowledge, Inc.
[EMAIL PROTECTED]   +1-718-236-0183



RFC 78 (v1) Improved Module Versioning And Searching

2000-08-09 Thread Perl6 RFC Librarian

This and other RFCs are available on the web at
  http://dev.perl.org/rfc/

=head1 TITLE

Improved Module Versioning And Searching

=head1 VERSION

  Maintainer: Steve Simmons [EMAIL PROTECTED]
  Date: 8 Aug 2000
  Version: 1
  Mailing List: [EMAIL PROTECTED]
  Number: 78
  CVSID: $Id: modules.pod,v 0.3 2000/08/09 04:01:14 scs Exp $

=head1 ABSTRACT

Modern production systems may have many versions of different modules
in use simultaneously.  Workarounds are possible, but they lead to
a vast spaghetti of fragile installation webs.  This proposal will
attempt to redefine module versioning and its handling in a way that
is fully upward compatible but solves the current problems.

An up-to-the-instant version of this RFC will be posted as HTML
at Chttp://www.nnaf.net/~scs/Perl6/RFCxx.html as soon as I
know the RFC number.

=head1 DESCRIPTION

There are several classes of problem with the current module
versioning and searching, which will be discussed separately.
The solutions proposed overlap, and are discussed in
BIMPLEMENTATION below.

=head2 Current Implementation Is Broken

These problems are ones in which I would go so far as to say that
the current (Cperl5) performance is actually broken.

=head3 Discovery Of Older Versions Aborts Searches

Currently a statement

  use  foo 1.2;

can cause Cperl to search C@INC until it finds a Cfoo.pm file
or exhausts the search path.  When a Cfoo.pm, its CVERSION
is checked against the one requested in the Cuse statement.
If the Cfoo.pm version is less than 1.2, Cperl immediately
gives an error message and halts the compilation.
A satisfactory version may exist elsewhere in C@INC, but it is
not searched for.

=head3 First Module Discovered May Not Be Newest

I believe that when a programmer writes

use module;

`Do What I Mean' should find the newest version of the module present on the
C@INC search path.
Instead, the very first Cmodule.pm file found is taken,
regardless of the presence of others on the path.

=head2 Current Methods Are Insufficient for Complex Installations

Deployment of perl modules in high-reliability or widely shared
environments often requires multiple versions of modules installed
simultaneously.
(Comments `but that's a bad idea' will be cheerfully ignored --
if I could control what other departments need, I would).
This leads to an endless proliferation of Cuse lib directories
and ever-more-pervasive `silos of development.'

Part of the problem is the limitations of the current system in
how modules are versioned and how Cperl decides which version
to load.  In worst case, code such as

use lib '/path/to/department/module/versionX';
use module ;# To get version X for sure
no use lib '/path/to/department/module/versionX';

has been found in production equipment.
Why does such bogosity occur?
It's an attempt to solve both the above problems and
the deployment issues which follow below.

=head3 New Module Releases Can Break Existing Scripts

IWorking tools persist.
An application which does its job well will live as long as the
problem it addresses.
This means old code may continue running for a long time.

For Cperl itself, most sites solve this problem by having
the perl invocation include versioning:

   #!/usr/bin/perl5.005

The indicated version will likely remain installed and stable as long
as the script which uses it and the platform on which that script runs.

The proliferation and increasing use of modules is generally a
good thing.  However, installation of new modules can and sometimes
does break existing scripts.  Workarounds for this problem are
cumbersome at best, and we have existence proofs in other languages
that this can be handled better (notably Ctcl, but there are
probably more).

=head3 Test Systems Need Test Modules

Mission-critical scripts often need to have a final test pass
by releasing experimental versions onto productions systems
alongside the production systems.

The inflexibility of perl module versioning also contributes to
difficulties in releasing systems for test.  A new script may require
significant changes to internals of one or more supporting modules.
The changes need not be visible to existing scripts; if bugs are introduced
then previously working systems may change or break in obscure ways.

Ideally, there would be a mechanism by which CscriptI.new or
CInewscript could be released
simultaneously with an appropriate version of CmoduleI.new.pm
or CInewmodule.pm
while the previous version
remains in place for older code.
A more flexible mechanism for module version specification
and searching can fix the problem. 

=head2 Proposed Solution

I believe that relatively simple changes can be made to the version
identification and module installation systems which will solve all
the above problems.
In addition, those changes should be largely upward compatible
from current functioning; and if needed could be made 100% 
compatible.

=head1 IMPLEMENTATION

Several changes, working