2007-08-16 基底
メソッド呼び出しで継承する
モジュールってないかな?
package Hoge; __PACKAGE__->base(qw/Class::Data::Inheritable/); # use base qw/Class::Data::Inheritable/;と同じ挙動
こんな感じで。use baseじゃなくてbase()メソッドを呼び出す感じで継承できないかな。
どっからでも呼べて欲しいのでUNIVERSALになるかな?ちょっと実装してみる。
package UNIVERSAL::base; use strict; require base; require Carp; sub UNIVERSAL::base { my ($class,@base) = @_; for my $base (@base) { next if $class->isa($base); eval qq{ package $class; base->import( '$base' ); }; Carp::croak $@ if $@; } }
eval使ってbase->import呼び出してるわけですが、この実装が微妙なんだよなぁ〜。
baseモジュールってimportでcaller使って元クラス名を割り出してるからeval使ってpackage指定しないとbase->import使えない。
任意のクラス名から継承出来る関数がbaseモジュールに存在してたらわざわざevalする必要なくてすむんだけどな・・・。
というかそんな関数(例えばbase関数とする)が存在してたら今僕が考えたUNIVERSAL::baseすらいらなくなるか。
package Hoge; require base; __PACKAGE__->base::base(qw/Class::Data::Inheritable/);
こーゆー感じでいけるわけで。なんで用意しないんだろう?
base::ballモジュールとかのソース見てもeval使ってるし、結構用途はあると思うんだけどなぁ。
追記:
mixinとして利用するかどうかは使い手が決めるもんかぁと思ったんで出来るだけbaseモジュールを使うようにしてみたのですがどうでしょうかね。
まぁ確かに@ISAに突っ込んだ方が早いのでbaseモジュールにこだわる必要もないかぁ。
トラックバック - http://d.hatena.ne.jp/fbis/20070816/1187247587





