frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

複数の定数クラス。

頭痛はなんとかアスピリンで誤魔化し

久々にドラム教室で、バシバシ叩く。

あー、楽しいけど、相変わらず下手だな、自分(笑)

そんな下手な自分は、悲しくもあるけど

下手な事にも頑張る自分を眺めるのも楽しいなぁ。

そんな訳で、無事帰ってきたものの、

自分の50m後ろを「頭痛さん」が

ヒタヒタ追っかけてきてる感じなので無理は禁物。

だけど、気になってまた複数の定数クラスの実装方法を検討。

いや、だから、無理は禁物なんだってばぁー…>自分

てな訳で、今度は「Net::Delicious::Constants」をパクる。

要は Constants/XXX.pm で定義した定数を

Constants.pm 内で、呼び出し元のスコープ内に

ちまちま設定してます。へい。

・Constants.pm

package Constants;

use strict;

sub import {

my $self = shift;

my $constant = '';

my $useTagName = '';

my $targetPackageName = '';

my $caller = caller;

my $package = '';

no strict 'refs';

foreach $useTagName (@_) {

next if $useTagName !~ /^:(.*)/;

$targetPackageName = $1;

$targetPackageName =~ s/:://g;

$package = join("::",__PACKAGE__,ucfirst(lc($targetPackageName)));

eval "require $package;";

if ($@) {

warn $@;

next;

}

foreach $constant (@{$package."::EXPORT_OK"}) {

*{join("::",$caller,$constant)} = \&{join("::",$package,$constant)};

}

}

}

1;

・Constants/User.pm

package Constants::User;

use strict;

use vars qw /@EXPORT_OK/;

@EXPORT_OK = qw/USER_ID COURSE_ID NAME_COLUMN/;

use constant USER_ID => 0;

use constant COURSE_ID => 1;

use constant NAME_COLUMN => 2;

1;

・Constants/Common.pm

package Constants::Common;

use strict;

use vars qw /@EXPORT_OK/;

@EXPORT_OK = qw/TRUE FALSE/;

use constant FALSE => 0;

use constant TRUE => 1;

1;

・test.pl

#!/usr/bin/perl -w

use strict;

use lib '/home/anigon/constants';

use Constants qw(:user :common);

print FALSE."\n";

print NAME_COLUMN."\n";

exit;