ダサくて泥臭いけど、直接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 件のコメント:
コメントを投稿