Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

use base [ MODULE => version ]; (a change to base.pm)

by crazyinsomniac (Prior)
on Jun 17, 2002 at 10:46 UTC ( [id://175044]=note: print w/replies, xml ) Need Help??


in reply to use base { MODULE = version}? (a change to base.pm)

After I finally decided to submit this to the perl5 porters, somebody took interest and pointed out a few flaws, like the fact that the original version of my update breaks inheritance. Benjamin Goldberg also went out to say that he likes to use the VERSION function for version checking, so here it is, the final rendition of base.pm (replacing the {} with [ ], and not breaking inheritance, or causing weirdo exporter errors)
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;"

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://175044]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others contemplating the Monastery: (4)
As of 2024-04-20 03:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found