Changeset 23317

Show
Ignore:
Timestamp:
11/12/08 14:23:36 (5 years ago)
Author:
kazuho
Message:

implement include

Location:
lang/perl/NanoA/trunk
Files:
1 added
2 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/NanoA/trunk/example/MyApp/mojo.mt

    r23309 r23317  
    55<body> 
    66Hello to <%= $app->query->param('user') || '' %>. 
     7<hr> 
     8<%= $app->include('copyright') %> 
    79</body> 
    810</html> 
  • lang/perl/NanoA/trunk/lib/NanoA.pm

    r23310 r23317  
    140140    return 
    141141        unless -e "$path.mt"; 
     142    NanoA::Mojo::Template->__load($path); 
     143} 
     144 
     145sub not_found { 
     146    my ($klass, $opts) = @_; 
     147    $opts->{not_found} || 'NanoA/NotFound'; 
     148} 
     149 
     150sub camelize { 
     151    # copied from String::CamelCase by YAMANSHINA Hio 
     152    my $s = shift; 
     153    join('', map{ ucfirst $_ } split(/(?<=[A-Za-z])_(?=[A-Za-z])|\b/, $s)); 
     154} 
     155 
     156package NanoA::Mojo::Template; 
     157 
     158use strict; 
     159use warnings; 
     160 
     161use base qw(NanoA); 
     162 
     163my $MOJO_LOADED; 
     164 
     165sub include { 
     166    my ($app, $path) = @_; 
     167    my $module = $app->__load($app->config->{prefix} . "/$path"); 
     168    $module->__run_as($app); 
     169} 
     170 
     171sub __load { 
     172    my ($self, $path) = @_; 
     173    my ($module, $code) = $self->__compile($path); 
     174    local $@; 
     175    eval $code; 
     176    die $@ if $@; 
     177    $module; 
     178} 
     179 
     180sub __compile { 
     181    my ($self, $path) = @_; 
    142182    my $module = $path; 
    143183    $module =~ s{/}{::}; 
    144     require 'Mojo/Template.pm'; 
     184    unless ($MOJO_LOADED) { 
     185        require 'Mojo/Template.pm'; 
     186        $MOJO_LOADED = 1; 
     187    } 
    145188    my $mt = Mojo::Template->new; 
    146     $mt->parse(read_file("$path.mt")); 
     189    $mt->parse(__read_file("$path.mt")); 
    147190    $mt->build(); 
    148191    my $code = $mt->code(); 
    149192    $code = << "EOT"; 
    150 use Mojo::Template; 
    151193package $module; 
    152 use base qw(NanoA); 
     194use base qw(NanoA::Mojo::Template); 
    153195sub run { 
    154196    my \$app = shift; 
     
    156198    \$code->(); 
    157199} 
     200sub __run_as { 
     201    my (\$klass, \$app) = \@_; 
     202    run(\$app); 
     203} 
    1582041; 
    159205EOT 
    160206; 
    161     local $@; 
    162     eval $code; 
    163     die $@ if $@; 
    164     $module; 
    165 } 
    166  
    167 sub not_found { 
    168     my ($klass, $opts) = @_; 
    169     $opts->{not_found} || 'NanoA/NotFound'; 
    170 } 
    171  
    172 sub camelize { 
    173     # copied from String::CamelCase by YAMANSHINA Hio 
    174     my $s = shift; 
    175     join('', map{ ucfirst $_ } split(/(?<=[A-Za-z])_(?=[A-Za-z])|\b/, $s)); 
    176 } 
    177  
    178 sub read_file { 
     207    ($module, $code); 
     208} 
     209 
     210sub __read_file { 
    179211    my $fname = shift; 
    180212    open my $fh, '<', $fname or die "cannot read $fname:$!";