package GenObj; my %methods = ( name => sub { $_[0]{DATA}{name} }, setname => sub { $_[0]{DATA}{name} = $_[1] }, # ... ); sub new { my ($class) = @_; bless { DATA => {}, METHODS => {%methods} }, $class; } AUTOLOAD { (my $method = $AUTOLOAD) =~ s/.*:://; $_[0]{METHODS}{$method} ? goto &{$_[0]{METHODS}{$method}} : die "unsupported method $method for object"; } package main; $foo = GenObj->new; $foo->setname("Jeff"); print $foo->name;