in reply to use base { MODULE = version}? (a change to base.pm)
a patch for CORE MODULE base.pm, to allow for use base [ MODULE => VER +SION ]; Feel free to do as you wish. A thanks to benjamin goldbert for taking the time to point out the fla +ws in my previous submission. =head1 NAME base - Establish IS-A relationship with base class at compile time =head1 SYNOPSIS package Baz; use base qw(Foo Bar); ## new usage allowed by podmaster, allows you to request a version + number; package Baz; use base [ Foo => 1, 'Foo::Bar' => 2 ]; =head1 DESCRIPTION Roughly similar in effect to BEGIN { require Foo; require Bar; push @ISA, qw(Foo Bar); } Will also initialize the %FIELDS hash if one of the base classes has it. Multiple inheritance of %FIELDS is not supported. The 'base' pragma will croak if multiple base classes have a %FIELDS hash. See L<fields> for a description of this feature. When strict 'vars' is in scope I<base> also let you assign to @ISA without having to declare @ISA with the 'vars' pragma first. If any of the base classes are not loaded yet, I<base> silently C<require>s them. Whether to C<require> a base class package is determined by the absence of a global $VERSION in the base package. If $VERSION is not detected even after loading it, <base> will define $VERSION in the base package, setting it to the string C<-1, set by base.pm>. The new feature of this module, allows for version checking via use base [ 'MODULE' => 33 ]; # version 33 which is roughly equivalent to use MODULE 33; use base 'MODULE'; and will C<croak> much like C<perl -MMODULE=33 -e 1> if version 33 of MODULE is not available =head1 HISTORY This module was introduced with Perl 5.004_04. =head1 SEE ALSO L<fields> =cut package base; use 5.006_001; our $VERSION = "1.02"; sub import { my $class = shift; my $fields_base; my $pkg = caller(0); my @bases = @_; ##podmaster - cause i don't wanna modify @bases my %BASV=(); ##podmaster my @BASV=(); ##podmaster if(ref $bases[0] eq 'ARRAY') { ##podmaster my $beep = 0; @BASV = @{$bases[0]}; %BASV = @BASV; @bases = grep {$_} map { ($beep++ % 2) ? () : ($_) } @BASV; } foreach my $base (@bases) { ##podmaster next if $pkg->isa($base); push @{"$pkg\::ISA"}, $base; my $vglob; unless (${*{"$base\::VERSION"}{SCALAR}}) { eval "require $base"; # Only ignore "Can't locate" errors from our eval require. # Other fatal errors (syntax etc) must be reported. die if $@ && $@ !~ /^Can't locate .*? at \(eval /; unless (%{"$base\::"}) { require Carp; Carp::croak("Base class package \"$base\" is empty.\n", "\t(Perhaps you need to 'use' the module ", "which defines that package first.)"); } ${"$base\::VERSION"} = "-1, set by base.pm" unless ${*{"$base\::VERSION"}{SCALAR}}; #' } ##podmaster - allows for use base [ module => versionnumber ] ## thanks Benjamin Goldberg if(exists $BASV{$base} ) { ## wanted > available $base->VERSION( $BASV{$base} ); } # A simple test like (defined %{"$base\::FIELDS"}) will # sometimes produce typo warnings because it would create # the hash if it was not present before. my $fglob; if ($fglob = ${"$base\::"}{"FIELDS"} and *$fglob{HASH}) { if ($fields_base) { require Carp; Carp::croak("Can't multiply inherit %FIELDS"); } else { $fields_base = $base; } } } if ($fields_base) { require fields; fields::inherit($pkg, $fields_base); } } 1;
| ______crazyinsomniac_____________________________ Of all the things I've lost, I miss my mind the most. perl -e "$q=$_;map({chr unpack qq;H*;,$_}split(q;;,q*H*));print;$q/$q;" |
|
|---|