3

「ゴースト」パッケージとサブを作成できるようにしたいと思います。次のようなエントリを含む構成(ini)ファイルがあります。

[features]
sys.ext.latex = off
gui.super.duper.elastic = off
user.login.rsa = on

このファイルは解析され、後の開発者は次のような質問をすることができます。

if ( MyApp::Feature->enabled ( 'user.login.rsa' ) { ... }

(全体のアイデアは、MartinFowlerのFeatureTogglehttp : //martinfowler.com/bliki/FeatureToggle.htmlに基づいています)

MyApp :: Featureで呼び出しをキャッチするためにAUTOLOADを使用し、iniファイルを解析するためにBEGINブロックを使用すると、次のAPIを提供できます。

if ( MyApp::Feature->user_login_rsa ) { ... }

問題は次のとおりです。次のAPIを作成することは可能ですか。

if ( MyApp::Feature::User::Login::RSA ) { ... }

MyApp :: Featureだけを持っていますか?

小文字、大文字は設定ファイルで変更できますが、ここでは問題になりません。そして、明確にしてください。実装は構成から切り離されており、MyApp :: Feature :: User :: Login :: RSAはなく、決してそうなることはありません。この機能の実装は、MyApp::Humansにあります。

MyApp :: Feature :: Foo :: Barを配置すると、そのようなパッケージが必要であることがわかります。しかし、開発者は、フィーチャーパッケージがフィーチャートグルを管理するという慣習を知っており、問題はありません。私は最初の例を見つけました(enabled($ string)ビットを使用すると複雑すぎて読むことができません

if ( package::package->method ( string ) )

2番目の方が良い:

if ( package::package->method )

3番目はさらに簡単です:

if ( package::package::package )

では、パッケージレベルでAUTOLOADをシミュレートすることは可能ですか?

あいさつ、ロブ。


4

1 に答える 1

4

したがって、名前空間にインストールしたい複数単語のキーのリストがあるようです。

BEGIN {
    my %states = ( # the values that should be transformed
        on  => sub () {1},
        off => sub () {''},
    );
    sub install_config {
        my ($package, $config) = @_;
        for my $key (keys %$config) {
            my @parts = map ucfirst, split /\./, $key;
            my $name  = join '::' => $package, @parts;
            no strict 'refs';
            *{$name} = $states{$$config{$key}} # use a tranformed value
                    || sub () {$$config{$key}} # or the value itself
        }
    }
}

BEGIN {
    my %config = qw(
        sys.ext.latex            off
        gui.super.duper.elastic  off
        user.login.rsa           on
        some.other.config        other_value
    );
    install_config 'MyApp::Feature' => \%config;
}

say MyApp::Feature::Sys::Ext::Latex ? 'ON' : 'OFF';             # OFF
say MyApp::Feature::Gui::Super::Duper::Elastic ? 'ON' : 'OFF';  # OFF
say MyApp::Feature::User::Login::Rsa ? 'ON' : 'OFF';            # ON
say MyApp::Feature::Some::Other::Config;                        # other_value

ここにインストールされた定数サブルーチンは、該当する場合に perl によってインライン化されます。

install_configパッケージのインポート関数に入れることで、少し使いやすくすることができます:

BEGIN {$INC{'Install/Config.pm'}++} # fool require

sub Install::Config::import {shift; goto &install_config}

use Install::Config 'MyApp::Feature' => {qw(
    sys.ext.latex            off
    gui.super.duper.elastic  off
    user.login.rsa           on
    some.other.config        other_value
)};
于 2012-03-15T00:58:33.713 に答える