July 2000
Intermediate to advanced
1104 pages
35h 1m
English
In the Pet module:
package Pet;
use strict;
use fields qw(name weight _Pet_pid);
my $PID = 0;
sub new {
my Pet $self = shift;
unless (ref $self) {
$self = fields::new($self);
$self->{_Pet_pid} = "this is Pet's secret ID";
}
$self->{name} = "Hey, you!";
$self->{weight} = 20;
return $self;
}
1;In a separate program, demopet:
use Pet;
my Pet $rock = new Pet; # typed lexical
$rock->{name} = "quartz";
$rock->{weight} = "2kg";
$rock->{_Pet_pid} = 1233; # private attribute
$rock->{color} = "blue"; # generates compile-time errorIn the Dog module:
package Dog;
use strict;
use base 'Pet'; # inherit fields and methods from Pet
use fields qw(name pedigree); # override Pet name attribute,
# add new pedigree attribute
use fields qw(wag _Dog_private); # not shared with Pet
sub new {
my $class = shift;
my $self = fields::new($class);
$self->SUPER::new(); # init base fields
$self->{pedigree} = "none"; # init own fields
return $self;
}In a separate program, demodog:
use Dog;my Dog $spot = new Dog; # typed lexical
$spot->{name} = "Theloneus"; # not inherited
$spot->{weight} = "30lbs"; # inherited
$spot->{pedigree} = "mutt"; # not inherited
$spot->{color} = "brown"; # generates compile-time error
$spot->{_Pet_pid} = 3324; # generates compile-time errorThe fields pragma provides a method of
declaring class fields that can be type checked at compile time. This
relies on a feature known as pseudohashes: if a typed lexical variable
(my Pet $rock) is holding a reference (the
Pet object) and is used ...