use Person;

$him = new Person;

$him->name("Jason");

$him->age(23);

$him->peers( ["Norbert", "Rhys", "Phineas"] );

printf "%s is %d years old.\n", $him->name, $him->age;

print "His peers are: ", join(", ", @{$him->peers}), ".\n";

*****

package Person;

use Carp;       # see Carp.pm in chapter 7



my %fields = (

    name        => undef,

    age         => undef,

    peers       => undef,

);



sub new {

    my $that  = shift;

    my $class = ref($that) || $that;

    my $self  = {

        _permitted => \%fields,

        %fields,

    };

    bless $self, $class;

    return $self;

} 



sub AUTOLOAD {

    my $self = shift;

    my $type = ref($self) || croak "$self is not an object";

    my $name = $AUTOLOAD;

    $name =~ s/.*://;   # strip fully-qualified portion

    unless (exists $self->{_permitted}->{$name} ) {

        croak "Can't access `$name' field in object of class $type";

    } 

    if (@_) {

        return $self->{$name} = shift;

    } else {

        return $self->{$name};

    } 

} 

