新しいblogに移行しました

新ブログ "All Yout Bugs Are Belong To Ass" に移行しました!

2008-07-16

[Perl]変数からだとModule::Pluggableのsearch_pathを指定できないらしい。

前回の苦悩を解決すべく、調べてみた。

ダサくて泥臭いけど、直接Module/Pluggable.pmのimportメソッドにwarnを仕込んで確認した。
この際、背に腹は変えられない。

Module/Pluggable.pm


### 前略

sub import {
my $class = shift;
my %opts = @_;
use Data::Dumper;
warn Dumper \%opts;


my ($pkg, $file) = caller;
# the default name for the method is 'plugins'
my $sub = $opts{'sub_name'} || 'plugins';
# get our package
my ($package) = $opts{'package'} || $pkg;
$opts{filename} = $file;
$opts{package} = $package;

warn $opts{package};

my $finder = Module::Pluggable::Object->new(%opts);

### 後略


で、以下のようなパターンで実行。
lib/Parent.pm


### 前略

### パターン1
sub import {
use Module::Pluggable search_path => $_[0].'::Component', sub_name => 'components';
}

### パターン2
sub import {
use Module::Pluggable package => $_[0], search_path => $_[0].'::Component', sub_name => 'components';
}

### パターン3
sub import {
use Module::Pluggable search_path => 'Child::Component', sub_name => 'components';
}

### パターン4
sub import {
use Module::Pluggable package => 'Child', search_path => 'Child::Component', sub_name => 'components';
}

### パターン5
sub import {
use Module::Pluggable package => 'Child', search_path => $_[0].'::Component', sub_name => 'components';
}

### 後略


で、その結果。

### パターン1
Use of uninitialized value in concatenation (.) or string at ../lib/Parent.pm line 16.
$VAR1 = {
'require' => 1,
'search_path' => '::Component',
'sub_name' => 'components',
'package' => undef
};
Parent at /usr/lib/perl5/site_perl/5.8.8/Module/Pluggable.pm line 28.

### パターン2
Use of uninitialized value in concatenation (.) or string at ../lib/Parent.pm line 16.
$VAR1 = {
'require' => 1,
'search_path' => '::Component',
'sub_name' => 'components',
'package' => undef
};
Parent at /usr/lib/perl5/site_perl/5.8.8/Module/Pluggable.pm line 28.

### パターン3
$VAR1 = {
'require' => 1,
'search_path' => 'Child::Component',
'sub_name' => 'components',
'package' => undef
};
Parent at /usr/lib/perl5/site_perl/5.8.8/Module/Pluggable.pm line 28.

### パターン4
$VAR1 = {
'require' => 1,
'search_path' => 'Child::Component',
'sub_name' => 'components',
'package' => 'Child'
};
Parent at /usr/lib/perl5/site_perl/5.8.8/Module/Pluggable.pm line 28.

### パターン5
Use of uninitialized value in concatenation (.) or string at ../lib/Parent.pm line 16.
$VAR1 = {
'require' => 1,
'search_path' => '::Component',
'sub_name' => 'components',
'package' => 'Child'
};
Parent at /usr/lib/perl5/site_perl/5.8.8/Module/Pluggable.pm line 28.


よく見ると、変数で指定している箇所が根こそぎundefinedな扱いになっている。
つまり、「Module::Pluggableのsearch_pathには変数使えません」ということっぽいorz

多分、Module::Pluggableがimportでとりまわしている箇所だからとか、そういう理由なのかもしれない。もう少し掘り下げて調べねば。。。

Module::Pluggable::Objectを直接扱えとか、そういう感じではないかと勝手に憶測してみたり。。。

0 件のコメント: