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の速い版。