Changeset 23400

Show
Ignore:
Timestamp:
11/12/08 19:57:13 (5 years ago)
Author:
kazuho
Message:

optimize

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/NanoA/trunk/lib/NanoA.pm

    r23381 r23400  
    9595    print "\n"; 
    9696} 
    97      
     97 
     98my %LOADED; 
     99 
     100sub load_once { 
     101    my ($path, $mark_path) = @_; 
     102    $mark_path ||= $path; 
     103    return if $LOADED{$mark_path}; 
     104    local $@; 
     105    do "$path" 
     106        or return; 
     107    die $@ 
     108        if $@; 
     109    $LOADED{$mark_path} = 1; 
     110} 
     111 
     112sub loaded { 
     113    my $path = shift; 
     114    $LOADED{$path} = shift 
     115        if @_; 
     116    $LOADED{$path}; 
     117} 
     118 
    98119package NanoA::Dispatch; 
    99120 
     
    144165    $path =~ s{/+$}{}; 
    145166    local $@; 
    146     eval { 
    147         # should have a different invocation model for mod_perl and fastcgi 
    148         require "$path.pm"; 
    149     }; 
    150     unless ($@) { 
    151         my $module = $path; 
    152         $module =~ s{/}{::}g; 
    153         return $module; 
    154     } 
    155     return 
    156         if $@ =~ /^Can't locate /; 
    157     die $@; 
     167    NanoA::load_once("$path.pm") 
     168        or return; 
     169    my $module = $path; 
     170    $module =~ s{/}{::}g; 
     171    return $module; 
    158172} 
    159173 
     
    163177    return 
    164178        unless -e "$path.mt"; 
    165     NanoA::Mojo::Template->__load($config, $path); 
     179    NanoA::Mojo::Template::__load($config, $path); 
    166180} 
    167181 
     
    191205use base qw(NanoA); 
    192206 
    193 my %LOADED; 
    194  
    195207sub include { 
    196208    my ($app, $path) = @_; 
    197     my $module = $app->__load($app->config, $app->config->{prefix} . "/$path"); 
     209    my $module = __load($app->config, $app->config->{prefix} . "/$path"); 
    198210    $module->run_as($app); 
    199211} 
    200212 
    201213sub __load { 
    202     my ($self, $config, $path) = @_; 
     214    my ($config, $path) = @_; 
    203215    my $module = $path; 
    204216    $module =~ s{/}{::}g; 
    205217    return $module 
    206         if $LOADED{$path}; 
    207     if ($self->__use_cache($config, $path)) { 
    208         require "$config->{mt_cache_dir}/$path.mtc"; 
    209         $LOADED{$path} = 1; 
     218        if NanoA::loaded($path); 
     219    if (__use_cache($config, $path)) { 
     220        NanoA::load_once("$config->{mt_cache_dir}/$path.mtc", "$path.mt"); 
    210221        return $module; 
    211222    } 
    212     my $code = $self->__compile($path, $module); 
     223    my $code = __compile($path, $module); 
    213224    local $@; 
    214225    eval $code; 
    215226    die $@ if $@; 
    216     $self->__update_cache($config, $path, $code) 
     227    __update_cache($config, $path, $code) 
    217228        if $config->{mt_cache_dir}; 
    218     $LOADED{$path} = 1; 
     229    NanoA::loaded($path, 1); 
    219230    $module; 
    220231} 
    221232 
     233my $mt_loaded; 
     234 
    222235sub __compile { 
    223     my ($self, $path, $module) = @_; 
    224     __load_once("Mojo/Template.pm"); 
     236    my ($path, $module) = @_; 
     237    unless ($mt_loaded) { 
     238        require "Mojo/Template.pm"; 
     239        $mt_loaded = 1; 
     240    } 
    225241    my $mt = Mojo::Template->new; 
    226242    $mt->parse(__read_file("$path.mt")); 
     
    245261} 
    246262 
    247 sub __load_once { 
    248     my $path = shift; 
    249     return if $LOADED{$path}; 
    250     require "$path"; 
    251 } 
    252  
    253263sub __update_cache { 
    254     my ($self, $config, $path, $code) = @_; 
     264    my ($config, $path, $code) = @_; 
    255265    my $cache_path = $config->{mt_cache_dir}; 
    256266    foreach my $p (split '/', $path) { 
     
    266276 
    267277sub __use_cache { 
    268     my ($self, $config, $path) = @_; 
     278    my ($config, $path) = @_; 
    269279    return unless $config->{mt_cache_dir}; 
    270280    my @orig = stat "$path.mt"