クラス特有の定数であれば use constant
してあげれば良いだけですが、
(小さめの)アプリで共通で使う定数を定義する場合は手間で、だいたい次のような作業が必要に。
use constant
または サブルーチン定義- Exporter の
@EXPORT
やら@EXPORT_OK
やら@EXPORT_TAGS
やらを書く
この書き方では定数クラス自体の見通しも悪くなる上この作業が面倒で、 数人で作っている規模のアプリであれば定数はまとまっていたほうが見通し良いので、 Exporter の機能全部使える Constant::Exporter を書いてみた次第。
定数使うにしても全部 import されるのも嫌なので、タグをうまく使ってあげると追いやすいコードになるかな、と思ってます。
使い方は見ての通りで、
package MyApp::Constants;
use strict;
use warnings;
use Constant::Exporter (
EXPORT => {
FB_CLIENT_ID => 12345,
},
EXPORT_OK => {
TITLE_MAX_LENGTH => 128,
},
EXPORT_TAGS => {
user_status => {
USER_STATUS_FB_ASSOCIATED => 1,
USER_STATUS_FB_NOT_ASSOCIATED => 0,
},
},
EXPORT_OK_TAGS => {
fb_api_error => {
ERROR_OAUTH => 190,
ERROR_API_SESSION => 102,
ERROR_API_USER_TOO_MANY_CALLS => 17,
},
fb_payment_error => {
ERROR_PAYMENTS_ASSOCIATION_FAILURE => 1176,
ERROR_PAYMENTS_INSIDE_IOS_APP => 1177,
ERROR_PAYMENTS_NOT_ENABLED_ON_MOBILE => 1178,
},
},
);
1;
と書いておくと use MyApp::Constants qw( TITLE_MAX_LENGTH :fb_api_error );
と書けば定数を絞って使えますし、
use MyApp::Constants;
すれば EXPORT
と EXPORT_TAGS
に書いた定数が import されるので、利用頻度の高いものを書いておくと幸せになれる雰囲気がします。