Yet another class builder that using inside-out object technique

GitHub - hideo55/Shaft: Yet another class builder that using inside-out object technique

去年あたりに作ってたクラスビルダです。今更ながら github を使い出したのであげときました。

もともとは、一昨年あたりに PBP に載っていた Class::Std に感化されて作り始めたものですが、Mooseの存在を知ってから Moose-like syntax を取り入れたものです。Moose の勉強のため車輪の再発明をしてみましたが、おかげで Class::MOP まで解析してメタクラスの仕組みを理解できました。

特徴は

  • Inside-Out オブジェクト(っぽいもの。)
  • Attribute を Private/Protected/Public で宣言できる
  • メソッドにも Private/Protected/Public を設定できる
    • 上記の3つの特徴で一般的なハッシュリファレンスのオブジェクトより厳密なカプセル化ができる。
  • Mooseっぽい Syntax
    • has(Publicのエイリアス)
      • Native Trait も使える
    • Role もつかえる
    • もちろん method modifier も使える
  • Method attribute をメタクラスで扱える
  • 特異メソッドが使える
  • フック機能
    • 使い道が限られますが、プラグインで sub foo : Hook(prepare) { ... } と書いてあったら、プラグインのロード時に $self->add_hook( prepare => $coderef ) してフックを追加するような使い方をしています。
    • 今考えるとコア機能として必要なのか疑問。ShaftX::*でよかったかも

使用例

package Foo;
use Shaft;

Public foo => ( is => 'ro' );
Protected bar => ( is => 'ro' );
Private baz => ( is => 'rw' );

sub hoge : Protected {
    q{HOGE};
}
__PACKAGE__->meta->make_immutable;

package Foo::Role;
use Shaft::Role;

requires 'hoge';

package Qux;
use Shaft -extends => 'Foo';

with 'Foo::Role';

sub quxx {
    print shift->hoge;
}
__PACKAGE__->meta->make_immutable;
__END__

Inside-Out オブジェクトは素晴らしいアイデアなのですが、アトリビュートへのアクセス速度は単なるデリファレンスで済むハッシュリファレンスに劣りますので、実用的には Mo[o|u]se を使った方がいいかと思います。

[追記]

タイトルtypoってた・・・orz