0
輸出先のクラス名に依存する関数をエクスポートしたい。 Sub::Exporter
で簡単にできるはずだと思いましたが、残念ながらinto
のキーはジェネレータに渡されません。インポートするクラスの名前に応じて、Perl関数を簡単に生成する方法はありますか?
use strict;
use warnings;
package MyLog;
use Log::Log4perl qw(:easy get_logger);
use Sub::Exporter -setup => {
exports => [
log => \&gen_log,
audit_log => \&gen_log,
],
groups => [ default => [qw(log audit_log)] ],
collectors => ['category'],
installer => \&installer, # tunnel `into` value into generators
};
if (not Log::Log4perl->initialized()) {
#easy init if not initialised
Log::Log4perl->easy_init($ERROR);
}
sub gen_log {
my ($class, $name, $arg, $global) = @_;
my $category = $arg->{category};
$category = $global->{category}{$name} unless defined $category;
return sub { # return generator
my $into = shift; # class name passed by `installer`
$category = $name eq 'audit_log' ? "audit_log.$into" : $into
if !defined $category; # set default category
# lazy logger
my $logger;
return sub {
$logger or $logger = get_logger($category);
};
};
}
sub installer {
my ($args, $todo) = @_;
# each even value is still generator thus generate final function
my $i;
1 & $i++ and $_ = $_->($args->{into}) for @$todo;
Sub::Exporter::default_installer(@_);
}
1;
はすべてこの豊かなSub::Exporter
能力犠牲にすることなく、それを行うにはどのように良い方法はあります:私はそれらの醜いコード例になってしまったのか?例えば
私はそれらのいずれかを使用したいと思います:
use MyLog category => { log => 'foo', audit_log => 'bar' };
use MyLog -default => { -prefix => 'my_' };
use MyLog
audit_log => { -as => 'audit' },
log => { -as => 'my_log', category => 'my.log' };
編集:質問へ追加しましたSub::Exporter
能力要件。
Edit2:使用例を追加しました。
あなたのコードは、この豊富なSub :: Exporter能力を必要としません。たとえば、MyLog category => {log => 'foo'、audit_log => 'bar'};またはMyLog -default => { - 接頭辞=> 'my_'}を使用します。または、MyLogを使用します。audit_log => { - as => 'audit'}、ログ=> { - as => 'my_log'、カテゴリ=> 'my.log'}; –
もしあなたがそれを望むなら、私の投票ではなく、あなたの疑問に言いました。 –
申し訳ありませんが、今質問に追加しました。 –