If a typed lexical variable holding a reference is used to access a
hash element and the %FIELDS hash of the given type exists, then the
operation is turned into an array access at compile time. The %FIELDS
-hash map from hash element names to the array indices. If the hash
+hash maps from hash element names to the array indices. If the hash
element is not present in the %FIELDS hash, then a compile-time error
is signaled.
as long as the objects are accessed through properly typed variables.
For untyped access to work you have to make sure that a reference to
the proper %FIELDS hash is assigned to the 0'th element of the array
-object (so that the objects can be treated like an AVHV). A
+object (so that the objects can be treated like an pseudo-hash). A
constructor like this does the job:
sub new
{
my $class = shift;
no strict 'refs';
- my $self = bless [\%{"$class\::FIELDS"], $class;
+ my $self = bless [\%{"$class\::FIELDS"}], $class;
$self;
}
=head1 SEE ALSO
L<base>,
-I<description of AVHVs>
+L<perlref/Pseudo-hashes: Using an array as a hash>
=cut
{
my($derived, $base) = @_;
- if (defined %{"$derived\::FIELDS"}) {
+ if (keys %{"$derived\::FIELDS"}) {
require Carp;
Carp::croak("Inherited %FIELDS can't override existing %FIELDS");
} else {
{
for my $pkg (sort keys %attr) {
print "\n$pkg";
- if (defined @{"$pkg\::ISA"}) {
+ if (@{"$pkg\::ISA"}) {
print " (", join(", ", @{"$pkg\::ISA"}), ")";
}
print "\n";