アクセサ[3]。
前回の、ちょっとミスがあったので、訂正。
・DTO.pm
package DTO;use strict;
use warnings;
use Carp;
sub new {
my $me = shift;
my $param = {
};
bless $param, $me;
}
sub _makeAccesor {
my $me = shift;
no strict 'refs';
my $methodName = '';
my $field = '';
foreach $field (@_) {
$methodName = ucfirst $field;
next if defined &{"${me}::set${methodName}"};
*{"${me}::set${methodName}"} = sub {
$_[0]->{$field} = $_[1];
};
*{"${me}::get${methodName}"} = sub {
return $_[0]->{$field};
};
}
}
1;
$me でパッケージ名を指定しないと、
DTO.pm に定義しちゃって、
「Subroutine DTO::XXX redefined at DTO.pm line XX」とかって出ちゃうんで。
・DTO::User.pm
package DTO::User;use base qw/DTO/;
__PACKAGE__->_makeAccesor(qw/name age/);
1;
・DTO::Guest.pm
package DTO::Guest;use base qw/DTO/;
__PACKAGE__->_makeAccesor(qw/name age/);
1;
・test.pl
#!/usr/bin/perl -wuse strict;
use DTO::User;
use DTO::Guest;
my $objUser = DTO::User->new();
$objUser->setAge(35);
print $objUser->getAge()."\n";
$objUser->setName('anigon');
print $objUser->getName()."\n";
my $objGuest = DTO::Guest->new();
$objGuest->setAge(35);
print $objGuest->getAge()."\n";
$objGuest->setName('anigon');
print $objGuest->getName()."\n";
exit;
これなら問題なく動きます。へい。