2012-03-14 22 views
3

"ゴースト"パッケージとサブを作成したいと思っています。私はこのようなエントリを持つ設定(INI)ファイルを持っている:このファイルは解析されPerl5で機能トグルを実装する

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

を、以降の開発者は、次のような質問尋ねることができます:

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

(全体的なアイデアは、Martin Fowler氏のFeatureToggleに基づいていますがhttp://martinfowler.com/bliki/FeatureToggle.html

のMyApp ::機能で呼び出しをキャッチするためにAUTOLOADを使用して、そして私たちは、このAPIを提供することができますiniファイルを解析するためのブロックをBEGIN:

質問です:

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

のみのMyApp ::機能を持つ:それは、次のAPIを作成することは可能ですか?

大文字小文字は、設定ファイルで変更できますが、これは問題ではありません。そして、実装が設定から切り離されていることを明確にすると、MyApp :: Feature :: User :: Login :: RSAは存在せず、決してなりません。この機能の実装はf.eです。 MyApp :: Humanでは

私は、MyApp :: Feature :: Foo :: Barを置くことで、そのようなパッケージが存在することが示唆されています。しかし、開発者は、フィーチャー・パッケージがフィーチャー・トグルを管理しており、フィーチャー・パッケージがそれに問題がないという規則を知っています。私は読むためには複雑すぎる有効($文字列)ビットを使用して(最初の例を見つける

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

秒1よりよい:第三はさらに容易になるだろう

if (package::package->method) 

if (package::package::package) 

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

Greetings、 Ro b。


+0

細部に悪魔: 'のMyApp ::機能::ユーザー::ログイン:: RSA'はしていません厳密に言えば、それは裸足です。最後の部分を関数呼び出しにすることができます: 'MyApp :: Feature :: User :: Login :: RSA()' – daxim

答えて

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 
)}; 
関連する問題