6 $VERSION = eval $VERSION;
11 sub PUBLIC () { 2**0 }
12 sub PRIVATE () { 2**1 }
13 sub INHERITED () { 2**2 }
14 sub PROTECTED () { 2**3 }
17 my $Fattr = \%fields::attr;
21 my $fglob = ${"$base\::"}{FIELDS};
22 return( ($fglob && 'GLOB' eq ref($fglob) && *$fglob{HASH}) ? 1 : 0 );
27 my $vglob = ${$base.'::'}{VERSION};
28 return( ($vglob && *$vglob{SCALAR}) ? 1 : 0 );
33 my($class) = ref $proto || $proto;
34 return exists $Fattr->{$class};
38 $Fattr->{$_[0]} = [1] unless $Fattr->{$_[0]};
39 return $Fattr->{$_[0]};
44 # Shut up a possible typo warning.
45 () = \%{$_[0].'::FIELDS'};
46 my $f = \%{$_[0].'::FIELDS'};
48 # should be centralized in fields? perhaps
49 # fields::mk_FIELDS_be_OK. Peh. As long as %{ $package . '::FIELDS' }
50 # is used here anyway, it doesn't matter.
51 bless $f, 'pseudohash' if (ref($f) ne 'pseudohash');
58 # Shut up a possible typo warning.
59 () = \%{$_[0].'::FIELDS'};
60 return \%{$_[0].'::FIELDS'};
67 return SUCCESS unless @_;
69 # List of base classes from which we will inherit %FIELDS.
72 my $inheritor = caller(0);
76 foreach my $base (@_) {
77 if ( $inheritor eq $base ) {
78 warn "Class '$inheritor' tried to inherit from itself\n";
81 next if grep $_->isa($base), ($inheritor, @bases);
83 if (has_version($base)) {
84 ${$base.'::VERSION'} = '-1, set by base.pm'
85 unless defined ${$base.'::VERSION'};
92 # Only ignore "Can't locate" errors from our eval require.
93 # Other fatal errors (syntax etc) must be reported.
94 die if $@ && $@ !~ /^Can't locate .*? at \(eval /;
95 unless (%{"$base\::"}) {
99 Base class package "$base" is empty.
100 (Perhaps you need to 'use' the module which defines that package first,
101 or make that module available in \@INC (\@INC contains: @INC).
104 $sigdie = $SIG{__DIE__} || undef;
106 # Make sure a global $SIG{__DIE__} makes it out of the localization.
107 $SIG{__DIE__} = $sigdie if defined $sigdie;
108 ${$base.'::VERSION'} = "-1, set by base.pm"
109 unless defined ${$base.'::VERSION'};
113 if ( has_fields($base) || has_attr($base) ) {
114 # No multiple fields inheritance *suck*
117 Carp::croak("Can't multiply inherit fields");
119 $fields_base = $base;
123 # Save this until the end so it's all or nothing if the above loop croaks.
124 push @{"$inheritor\::ISA"}, @isa_classes;
126 push @{"$inheritor\::ISA"}, @bases;
128 if( defined $fields_base ) {
129 inherit_fields($inheritor, $fields_base);
135 my($derived, $base) = @_;
137 return SUCCESS unless $base;
139 my $battr = get_attr($base);
140 my $dattr = get_attr($derived);
141 my $dfields = get_fields($derived);
142 my $bfields = get_fields($base);
144 $dattr->[0] = @$battr;
146 if( keys %$dfields ) {
148 $derived is inheriting from $base but already has its own fields!
149 This will cause problems. Be sure you use base BEFORE declaring fields.
154 # Iterate through the base's fields adding all the non-private
155 # ones to the derived class. Hang on to the original attribute
156 # (Public, Private, etc...) and add Inherited.
157 # This is all too complicated to do efficiently with add_fields().
158 while (my($k,$v) = each %$bfields) {
160 if ($fno = $dfields->{$k} and $fno != $v) {
162 Carp::croak ("Inherited fields can't override existing fields");
165 if( $battr->[$v] & PRIVATE ) {
166 $dattr->[$v] = PRIVATE | INHERITED;
169 $dattr->[$v] = INHERITED | $battr->[$v];
174 foreach my $idx (1..$#{$battr}) {
175 next if defined $dattr->[$idx];
176 $dattr->[$idx] = $battr->[$idx] & INHERITED;
187 base - Establish an ISA relationship with base classes at compile time
192 use base qw(Foo Bar);
196 Unless you are using the C<fields> pragma, consider this module discouraged
197 in favor of the lighter-weight C<parent>.
199 Allows you to both load one or more modules, while setting up inheritance from
200 those modules at the same time. Roughly similar in effect to
206 push @ISA, qw(Foo Bar);
209 C<base> employs some heuristics to determine if a module has already been
210 loaded, if it has it doesn't try again. If C<base> tries to C<require> the
211 module it will not die if it cannot find the module's file, but will die on any
212 other error. After all this, should your base class be empty, containing no
213 symbols, it will die. This is useful for inheriting from classes in the same
214 file as yourself, like so:
217 sub exclaim { "I can have such a thing?!" }
222 If $VERSION is not detected even after loading it, <base> will define $VERSION
223 in the base package, setting it to the string C<-1, set by base.pm>.
225 C<base> will also initialize the fields if one of the base classes has it.
226 Multiple inheritance of fields is B<NOT> supported, if two or more base classes
227 each have inheritable fields the 'base' pragma will croak. See L<fields>,
228 L<public> and L<protected> for a description of this feature.
230 The base class' C<import> method is B<not> called.
237 =item Base class package "%s" is empty.
239 base.pm was unable to require the base package, because it was not
242 =item Class 'Foo' tried to inherit from itself
244 Attempting to inherit from yourself generates a warning.
253 This module was introduced with Perl 5.004_04.
257 Due to the limitations of the implementation, you must use
258 base I<before> you declare any of your own fields.