sub AUTOLOAD { my $self = shift; my $type = ref($self) or 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 class $type"; } eval ("sub $AUTOLOAD { my (\$self,\$value) = \@_; \$self->{$name} = \$value if defined \$value; \$self->{$name}; }"); die $@ if $@; goto &$AUTOLOAD; }