Despite my throw-it-over the transom comments on global vars, that's
not really why I came here (tho I will pitch in on the topic).
The perl features that most bites me in the ass is how module versioning
and searching works. The easiest way to describe what I want is by
examples, so here are several of them. And yes, I'm volunteering to
write the RFC -- but consider this note a request for any other ideas
or requests which came up before I was paying attention. Like, say,
before Monday of last week.
Recovery from discovery of older versions:
Currently
use foo 1.2;
will fail if a version prior to 1.2 (including a versionless version)
is found in @INC. Instead, perl should ignore any version which does
not match the users requirements.
Version Capping
One should be able to specify bottom and tops of version ranges, eg:
use foo "=<1.23"; # Any version up to and including 1.23
use foo "<1.23"; # Any version prior to 1.23
use foo "==1.23"; # Version 1.23 and only version 1.23
use foo "=>1.23"; # Any version from 1.23 forward
use foo ">1.23"; # Any version after 1.23
Do we want to require the quotes? I dunno, see below.
Version Listing, Ranging
One should be able to specify any of a range of versions:
use foo 1.0 .. 2.0 # standard perl range syntax
use foo 1.0 ... 2.0 # standard perl range syntax
use foo 1.0..2 ; # Barewords are interesting - is this a
# missing 3rd-level var, or a range?
# IMHO, it's an error - dots should balance
use foo 1.0..2.0 # But this is OK, 1.0 .. 2.0
or a list of versions:
use foo 1.0,1.1,>1.3;
Versioning in namespaces/modules:
Let us suppose that module foo requires module bar v1.0, while module
baz requires module bar 2.0. This should be permitted, eg:
foo.pm baz.pm
use bar '==1.0'; use bar '==2.0' ;
bar::op(); # Uses bar 1.0 op bar::op(); # Uses bar 2.0 op
bar::1.0::op(); # Same bar::2.0::op(); # Same
In general, if a version-qualified use of a package is done, it must
be with the version explicitly loaded.
This implies one could do:
use bar 1.0 ;
use bar 2.0 ;
bar::op() ; #Uses highest version loaded
bar::1.0::op() ; #Same
bar::2.0::op() ; #Same
IMHO, this opens incredibly ugly cans of syntatic and semantic worms.
However, IMHO it has to be allowed -- the bar::version packages are
treated as if they had separate names. Why? Because we want foo.pm
amd baz.pm to work right when the mainline says:
my $handle1 = new foo ;
my $handle2 = new bar ;
my $var1 = $handle1->op(); # Always gets op 1.0
my $var2 = $handle2->op(); # Always gets op 2.0
Clearly both versions must be loaded simultaneously, and we need the
possibility of that main going on to do
my $opval1 = op::1.0() ;
my $opval2 = op::2.0() ;
Note this might prove to be invaluable in testing new versions of modules.
General notes:
Subversion defaults should be well-defined - does "<=2.0" succeed or
fail with "2.0.1"? IMHO any unspeicifed ranges should be assumed to
be `0', then the >/=/< applied. Thus 2.0.1 would not satisfy "<=2.0".
And that's my over-the transom thoughts on the matter.