このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
さて、property を使って、Employee.pm を作ってみよう。
基本的には他のモジュールを取り込むのと同じ要領だ。
========== Employee.pm ==========
package Employee;
use v5.6.1;
use strict;
use warnings;
use Carp;
use property 'name' => 'salary',
'get' => \&get_salary, 'set' => \&set_salary;
BEGIN {
our $Version = '0.07';
}
sub new {
my ($package, %identity) = @_;
$package = (ref $package or $package or __PACKAGE__);
bless(\%identity, $package);
}
sub name {
$_[0]->{'name'};
}
sub gender {
$_[0]->{'gender'};
}
sub weight {
$_[0]->{'weight'};
}
sub get_salary {
my $this = $_[0];
$this->{'salary'};
}
sub set_salary {
my ($this, $value) = @_;
if ($value < 140000) { croak "I can't agree you offered!" }
$this->{'salary'} = $value;
}
1;
========== end of Employee.pm ==========
一気にシンプルになった。
Employee.pm も他から利用するためのモジュールなので、
Carp モジュールをつかってエラーを発生させることにする。
die を使った場合、die した場所がエラー箇所となるが、
Carp の croak を使えば、croak したメソッドを呼び出した
呼び出し元(大概はユーザコード)の場所がエラーとなり、
利用者にとって見やすくなるのだ。
コードには見えないが、Employee モジュールには、
property モジュールによって、
salary メソッドが追加されている。
上記のコードを、テストしてみる。
EmployeeTest.pl というファイル名にしておこう。
========== EmployeeTest.pl ==========
#!/usr/local/bin/perl
use strict;
use warnings;
use lib '.';
use Employee;
my $jack = Employee->new(
'name' => 'Jack',
'gender' => 'male',
'salary' => 160000,
'weight' => '65kg',
);
$jack->set_salary(100000);
========== end of EmployeeTest.pl ==========
さて、実行してみよう。
$ ./EmployeeTest.pl
I can't agree you offered! at EmployeeTest.pl line 15
これは予想通りだ。Jack が文句をいうのも想定内だ。
「at EmployeeTest.pl line 15」となっているのが、
croak を使った効果である。
では、$jack->set_salary(100000); を、
$jack->salary = 100000; として実行してみよう。
$ ./EmployeeTest.pl
I can't agree you offered! at property.pm line 55
Jack が文句をいうのは、property モジュールのおかげだ。
ちゃんと salary というプロパティが追加されている。
しかし、行番号やファイル名がおかしい。
croak したのは、Employee.pm の set_salary だ。
Carp モジュールは呼び出し元をたどって、
その場所を行番号としているので、
set_salary を呼び出している property.pm が、
エラーの発生源となってしまっている。