2012-03-14 8 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') { ... } 

(전체 아이디어는 마틴 파울러의 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)) 

두 번째 더 나은 : 세 번째는 훨씬 더 쉽게 될 것

if (package::package->method) 

:

if (package::package::package) 

따라서 패키지 수준에서 AUTOLOAD를 시뮬레이션 할 수 있습니까?

인사말, Ro 비.


+0

악마 :'의 MyApp는 :: 특징 :: 사용자가 :: 로그인 :: RSA'는하지 않습니다

당신은 패키지의 가져 오기 기능으로 넣어 사용하는 install_config이 좀 더 쉽게 만들 수 있습니다 엄격한 건지, 그건 노약자 야. 마지막 부분을 함수 호출로 만들 수 있습니다 :'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로 인라인됩니다. 세부

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 
)};