#!/usr/bin/perl use warnings; use strict; my $test = Foo->new(); print $test->read_only, "\n"; $test->read_only("cheese"); # Won't do anything print $test->read_only, "\n"; print $test->read_write, "\n"; $test->read_write("cheese"); print $test->read_write, "\n"; package Foo; use vars '$AUTOLOAD'; sub new { bless { read_only => { value => "foo", editable => 0, }, read_write => { value => "bar", editable => 1, } } }; sub AUTOLOAD { no strict "refs"; my ($self, $new_value) = @_; my $field_name = $AUTOLOAD; $field_name =~ s/.*:://; if(grep /^$field_name$/,keys(%$self)) { #Build a different autoloader depending on whether # the field is editable if($self->{$field_name}{editable}) { if($new_value) { $self->{$field_name}{value} = $new_value; } *{$AUTOLOAD} = sub { if(2 == @_) { $self->{$field_name}{value} = $_[1]; } return $self->{$field_name}{value}; } } else { #Really ought to make this complain if you try setting a value. *{$AUTOLOAD} = sub { $self->{$field_name}{value}; }; } return $self->{$field_name}{value}; } else { die "No such method $AUTOLOAD. Barfing\n"; } } sub DESTROY { 1; }