2006 年 4 月 21 日 20 時 2 分

property.pm を使ってみる


このアーカイブは同期化されません。 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 が、
エラーの発生源となってしまっている。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.