frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

アクセサ[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 -w

use 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;

これなら問題なく動きます。へい。