base::ballなるものを触ってみた

ぼへーっとCPANRSS眺めてたらbase::ballとかいうが目に付いたのでさっそく触ってみた。

以下概要のまんまだけど例。

 package Hoge;
 use strict;
 use warnings;
 use base::ball qw/Foo::Utils/;

これが

 package Hoge;
 use strict;
 use warnings;
 use base qw/Foo::Utils/;
 use base qw/Foo::Utils::Data/;
 use base qw/Foo::Utils::UI/;
 use base qw/Foo::Utils::Sys/;
 use base qw/Foo::Utils::Sys::Unix/;
 use base qw/Foo::Utils::Sys::Win32/;
 use base qw/Foo::Utils::Run/;

と同じ処理になる。

要はそのパッケージ名で始まるモジュールをすべて継承してくれるモジュールってことですね。

ってかこんなに継承しなくちゃならない用途ってあるのかな?

継承するよりも単にuseするだけのモジュールだったら用途ありそうなんだけどもどうなんだろ。実際Module::Findのuseallがあるし。

あとこのモジュール、テストが通らなかったり、evalした後に$@をトラップしてないせいで存在しないモジュール渡してもエラーにならなかったり、実装が若干冗長だったりしたのでオレオレbase::ballを実装してみました。

 package base::ball;
 use strict;
 use warnings;
 use Carp qw/confess/;
 use Module::Find qw/useall/;
 require base;
 
 sub import {
     my (undef,@modules) = @_;
     my $caller = caller;
     
     for my $module (@modules) {
         my @base_modules = useall $module;
         for my $base_module ($module,@base_modules) {
             eval qq{
                 package $caller;
                 base->import('$base_module');
             };
             confess $@ if($@);
         }
     }
 }
 
 1;

だいぶ短くなっちった。もっと最適化できるかなぁ。