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;
}
Perlゼミ

