This AUTOLOAD sub is a general purpose accessor and mutator for data members of a class. It assumes the object is a blessed hashref. It's not as flexible as Class::Accessor, but eliminates the dependancy on an accessor/mutator module, or rolling your own.
#!/usr/bin/perl -w
package Foo;
use strict;
sub AUTOLOAD
{
no strict qw(refs vars);
my $pkg = __PACKAGE__;
$AUTOLOAD =~ s/${pkg}:://;
return if $AUTOLOAD eq 'DESTROY';
if(exists $_[0]->{$AUTOLOAD}) {
no strict 'refs';
*{$AUTOLOAD} = sub {
$_[1] ? $_[0]->{$AUTOLOAD} = $_[1]
: $_[0]->{$AUTOLOAD};
}
}
else {
die "Can't locate object method \"$AUTOLOAD\" via package \"$p
+kg\"";
}
&{$AUTOLOAD}(@_);
}
sub new
{
bless {foo => "bar"}, ref($_[0]) || $_[0];
}
package main;
use strict;
my $foo = new Foo;
print $foo->foo, "\n";
print $foo->foo("bas"), "\n";
print $foo->foo, "\n";
Update: Thanks to chipmunk for pointing out a regex problem.