もう少し高度なカスタムメタクラス
これまで紹介してきた使い方を踏まえたうえで、
オブジェクト定義から自動的にHTMLフォームへ
Webアプリケーションを書く場合、
リスト15では、
package MyWAF::Attribute::Field;
use Moose;
use Moose::Util::TypeConstraints;
extends 'Moose::Meta::Attribute'; # (1)
has field_type => ( # (2)
is => 'ro',
isa => enum([ 'text', 'password' ]),
default => 'text',
);
has maxlength => ( # (3)
is => 'ro',
isa => 'Int',
predicate => 'has_maxlength',
);
sub as_form_field { # (4)
my $self = shift;
my $html = qq[<input];
$html .= qq[ name="] . $self->name . qq["];
$html .= qq[ required] if $self->is_required;
$html .= qq[ type="] . $self->field_type . qq["];
if ( $self->has_maxlength ) {
$html .= qq[ maxlength="] .
$self->maxlength . qq["];
}
$html .= qq{>\n};
return $html;
}
まずリスト15field_
はこのアトリビュートをHTMLで表現する際に使えるフォーム種別maxlength
はフィールドのmaxlength
値を指定します。
リスト15as_
を定義します。 field_
やmaxlength
、is_
を参照しながらHTMLの一部を作成します。
Fieldアトリビュートを使う
このアトリビュートはMooseのhas()
のmetaclass
引数に指定するだけで使用できます
package User;
use Moose;
has name => (
metaclass => 'MyWAF::Attribute::Field', # (1)
is => 'ro',
isa => 'Str',
required => 1,
maxlength => 10,
);
has password => (
metaclass => 'MyWAF::Attribute::Field',
is => 'ro',
isa => 'Str',
required => 1,
field_type => 'password',
);
sub generate_form { # (2)
my $self = shift;
my $html = '';
for my $attribute ($self->meta->get_all_attributes) {
$html .= $attribute->as_form_field();
}
print $html;
}
User->generate_form();
【出力】
<input name="name" required type="text" maxlength="10">
<input name="password" required type="password">
残念ながらこれだけだとHTMLの出力のところまでフックできていませんので、
p5-mop─未来のMOP
これまでClass::MOPおよびMooseを前提として説明をしてきましたが、
Perlの基本的なオブジェクト指向機能は17年も前にPerl 4からの互換性を保つという足かせを持ちながら生まれました。それ以降、
p5-mopが完成した暁には、
また現在のCPANモジュールは、__
を呼び出すことが推奨されています。当然ですがこのような明示的な呼び出しは忘れがちですので、
もしp5-mopに興味を持たれた場合は、
まとめ
MOPの使い方とMooseを拡張するいくつかのモジュールを解説しました。オブジェクト指向プログラミングに対するこのような考え方は年々重要性を増しています。p5-mopの開発もそうですし、
さあ! 次回の執筆者はcho45さんで、