Object::Simple - Mojo::Base互換のアクセサを生成

デフォルト値つきのアクセサを作成するにはObject::Simpleを使用します。Object::SimpleはMojoliciousのMojo::Baseと高いレベルで互換性があります。

package Point;
use Object::Simple -base;

has x => 1;
has y => 1;

package main;

my $point = Point->new;
print $point->x;

1;

useするときに-baseを指定すると、Object::Simpleを継承することができます。Object::Simpleはnewメソッドを持ちます。またアクセッサを定義するためのhasというメソッドがインポートされます。またstrictとwarningsが自動的に有効になります。

一般的なクラスのサンプル

一般的なクラスのサンプルです。Pointクラスはxとyというアクセッサを持ちます。またclearというxとyを0に初期化するメソッドを持ちます。

package Point;
use Object::Simple -base;

has x => 0;
has y => 0;

sub clear {
  my $self = shift;
    
  $self->x(0);
  $self->y(0);
}

1;

Pointクラスは次のように使用します。コンストラクタnewはObject::Simpleから継承したものです。

my $point = Point->new(x => 4, y => 6);

$point->x(1);
$point->y(2);

my $x = $point->x;
my $y = $point->y;

$point->clear;

Object::Simpleの使い方

属性を定義する方法がいくつかあります。

複数の属性を一度に定義

# デフォルト値なし
has ['x', 'y'];

# デフォルト値あり
has ['x', 'y'] => 0;

配列のリファレンスをhasの第一引数に指定すると複数のアクセッサを一度に定義できます。

デフォルト値の指定

# 定数
has foo => 1;

# 配列のリファレンス
has foo => sub { [] };

# ハッシュのリファレンス
has bar => sub { {} };

# オブジェクト
has baz => sub { LWP::UserAgent->new };

配列のリファレンス、ハッシュのリファレンス、オブジェクトなどをデフォルト値に設定するときはsub { }で囲んで遅延評価する必要があります。

すべてのアクセサを一度に定義

has [qw/foo bar baz/],
    some => 1,
    other => sub { 5 };

すべてのアクセサの定義を一度に行うこともできます。

継承のサンプル

Pointクラスを継承したPoint3Dクラスを作成するサンプルです。

package Point3D;
use Point -base;

has z => 0;

sub clear {
  my $self = shift;
  $self->SUPER::clear();
  $self->z(0);
}

1;

コンストラクタのオーバーライド

コンストラクタnew()をオブジェクトの初期化や引数の加工のためにオーバーライドすることができます。

# オブジェクトの初期化のためのnew()のオーバーライド
sub new {
  my $self = shift->SUPER::new(@_);
  
  # Initialization
  
  return $self;
}
# 引数の加工のためのnew()のオーバーライド
sub new {
  my $self = shift;
  
  $self->SUPER::new(x => $_[0], y => $_[1]);
  
  return $self;
}

関連情報