package Class::Accessor::Eval; use Carp qw(croak carp); use strict; use warnings; sub import { my ($self, %args) = @_; my $get = $args{get}; my $set = $args{set}; my $names = $args{names}; my $class = caller(); for my $i (0..$#$names) { my $name = $names->[$i]; my $get = $get; my $set = $set; for ($get, $set) { s/\$name/$name/g; s/\$i/$i/g; } my $code = <<"EOM"; package $class; $get $set EOM eval $code; if ($@) { croak "Error compiling $name: $@\n"; } } } 1; ############# package Foo; use Class::Accessor::Eval get => <<'EOM', sub get_$name { $_[0]->[$i] } EOM set => <<'EOM', sub set_$name { $_[0]->[$i] = $_[1] } EOM names => [qw(name age city job salary ...)]; ##################### package main; my $foo = bless ["foo", 100], "Foo"; use Data::Dumper; warn Data::Dumper->Dump([\$foo], ['foo']); print $foo->get_age,$/; $foo->set_age(23); print $foo->get_age,$/;