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; }