クラス特有の定数であれば 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; すれば EXPORTEXPORT_TAGS に書いた定数が import されるので、利用頻度の高いものを書いておくと幸せになれる雰囲気がします。

https://metacpan.org/module/Constant::Exporter