WEB+DB PRESS Vol.104 の Perl Hackers Hubに「Minillaを使ったモダンなCPANモジュール開発」という記事を寄稿しました
次回のPerl Hackers Hubの執筆者を探しています!!!
プロジェクト共通の定数を簡単に宣言できるモジュール
use MyApp::Const;
と constant モジュールで書く
MyApp::Const::MYAPP_HOGE
とか書くのタルいMYAPP_HOGE
って書きたいuse constant CONST_HASH => {BAR => 'BAZ'};
とかやると
CONST_HASH->{BAR} = 'OVERWRITE'
で上書きできる OMG ><→ import機構を無理やりなんとかするのと、resticted hash/array にすることで解決
package MyApp::Const;
use Const::Common (
MYAPP_BAR => 'BAZ',
MYAPP_HASH => {
HOGE => 'hoge',
},
);
1;
use MyApp::Const;
print MYAPP_BAR; # BAZ
print MYAPP_HASH->{HOGE}; #=> hoge;
MYAPP_HASH->{HOGE} = 10; # ERROR!
package Const::Common;
require Exporter;
use Data::Lock ();
sub import {
my $pkg = caller;
shift;
my %constants = @_ == 1 ? %{ $_[0] } : @_;
Data::Lock::dlock my $locked = \%constants;
{
no strict 'refs';
push @{"$pkg\::ISA"}, ('Exporter');
push @{"$pkg\::EXPORT"}, (keys %$locked);
}
require constant;
@_ = ('constant', $locked);
goto constant->can('import');
}