end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

UNIVERSAL::requireによるモジュールの動的ロード

以前までperlでモジュールの動的を行う場合、AUTOLOADが関係すると思っていたのですが、UNIVERSAL::require というモジュールが利用できるそうです。

UNIVERSAL::require を使用しない場合

UNIVERSAL::require を使用しない場合、モジュールの動的ロードは次のように書くことができます。

my $class = "MyApp::Test";
eval{ require $class };
die "can't load module $class ", $@ if ( $@ );

UNIVERSAL::require を使用する場合

UNIVERSAL::requireを使用して先程のサンプルスクリプトを書き換えると次のようになります。

use UNIVERSAL::require;

my $class = "MyApp::Test";
$class->require or "can't load module $class ", $@;
#または  $class->require($version) or die $@; とも書けるらしい

$class->use(@options) って?

このエントリを書く際に次のurlを参考にさせていただいています。
http://egg.bomcity.com/wiki?UNIVERSAL%3A%3Arequire

この中で $class->use(@options) が紹介されています。

モジュールによっては use でロードする事を強要するものもあります。強要というわけでも在りませんがそういうモジュールはロードしてから自前で import をコールしてやる必要がありますが、UNIVERSAL::require はその当りも面倒見てくれます。

  "MyApp::$name"->use or die $@;
  
  # import で起動オプションを要求するなら。
  "MyApp::$name"->use(@options) or die $@;

まっ、$class->use(@options) に関しては別の機会に調べることにします。