OOP
クラスの基本
use strict; { package Person; use Carp qw(croak); #クラス変数 my $class_var = 'hoge'; #コンストラクタ sub new { ref (my $class = shift) and croak("warn: method 'new' is class method"); my $self = {Name => shift}; bless $self, $class; } #getter/setter: instance variable sub name { ref (my $self = shift) or croak("warn: method 'name' is instance method"); if (@_) { #setter $self->{Name} = shift; } else { #getter $self->{Name}; } } #getter/setter: class variable sub class_var { my $either = shift; if (@_) { #setter $class_var = shift; } else { $class_var; } } } my $kotaro1 = Person->new(''); my $kotaro2 = Person->new(''); #instance variable test $kotaro1->name('kotaro1'); $kotaro2->name('kotaro2'); printf("\$kotaro1 is %s\n", $kotaro1->name); printf("\$kotaro2 is %s\n", $kotaro2->name); #class variable test $kotaro1->class_var('foo'); $kotaro2->class_var('foo2'); printf("\$kotaro1 class var is %s\n", $kotaro1->class_var); printf("\$kotaro2 class var is %s\n", $kotaro2->class_var);
実行結果
$kotaro1 is kotaro1
$kotaro2 is kotaro2
$kotaro1 class var is foo2
$kotaro2 class var is foo2
OOPのためのモジュール
いくつあるので、整理してみる。
- Class::Data::Inheritable
class variableへのaccessorをつくれる。class valiableの継承もオーバーライドも可。
- Class::Accessor
instance variableへのaccessorを簡単につくれる。
- Class::Data::Accessor
Class::Data::Inheritable, Class::Accessorを一緒にしたもの。
- Class::Accessor::Fast
Class::Accessorの速い版。