Apache2-ASP
view release on metacpan or search on metacpan
lib/Apache2/ASP/ASPPage.pm view on Meta::CPAN
$$ref =~ s/(\$Response\->End)/return $1/gs;
$$ref = ';$Response->Write(q~' . $$ref . '~);';
# Now do the final ~ substitution:
$$ref =~ s{(\(q~)(.*?)(~\);)}{
my $pre = $1;
my $post = $3;
(my $txt = $2) =~ s/~/\\~/g;
"$pre$txt$post"
}xsge;
}# end _parse_scriptlet_tags()
#==============================================================================
sub _eval_compile_tags
{
my ($s) = @_;
my $ref = $s->source_code;
no warnings 'uninitialized';
while( $$ref =~ m/(<%\#\s*(.*?)\s*%>)/ )
{
my $tag = $1;
my $var = $2;
$$ref =~ s/\Q$tag\E/$var/ee;
}# end while()
}# end _eval_compile_tags()
#==============================================================================
sub _assemble_code
{
my ($s) = @_;
local $s->{childpage} = undef;
my $copy = bless {%$s}, ref($s);
unless( ref($copy) eq $copy->package_name )
{
$copy = bless { %$copy }, $copy->package_name;
}# end unless()
local $copy->{masterpage} = ref($copy->{masterpage});
local $copy->{source_code} = \'';
local $copy->{file_contents} = \'';
my $dump = Dumper( $copy );
$dump =~ s/^\$VAR1\s+\=//;
my $virtual_path = $s->masterpage ? $s->masterpage->virtual_path : '';
# Preamble:
my $code = <<"CODE";
package @{[ $s->package_name ]};
use strict;
use warnings 'all';
no warnings 'redefine';
our \$TIMESTAMP = @{[ time() ]};
sub _initialize_page {
eval { \$_[0]->SUPER::_initialize_page };
\$_[0]->init_asp_objects( \$_[0]->context );
\$_[0] = $dump;
\$_[0]->{masterpage} = \$_[0]->{masterpage}->new( virtual_path => '$virtual_path' ) if \$_[0]->{masterpage};
\$_[0];
}
CODE
# Things work differently if we have/don't have a master page:
if( $s->masterpage )
{
# Sub-class the master page:
$code .= <<"CODE";
BEGIN {
(my \$pkg = '@{[ ref($s->masterpage) ]}.pm') =~ s/::/\\\\/g;
use Apache2::ASP::ASPPage;
#eval { require \$pkg; 1 } or
Apache2::ASP::ASPPage->new(
virtual_path => '@{[ $s->masterpage->virtual_path ]}'
);
}
use base '@{[ ref($s->masterpage) ]}';
use vars ( '\$Master', __PACKAGE__->VARS );
@{[ join "\n\n", map { $s->placeholder_contents->{$_} } keys(%{ $s->placeholder_contents }) ]}
@{[ join "\n\n", map { "sub $_ {\$Response->Write(q~$s->{placeholders}->{$_}~);}" } keys(%{$s->placeholders}) ]}
CODE
}
else
{
# Just sub-class this class:
$code .= <<"CODE";
use base 'Apache2::ASP::ASPPage';
use vars __PACKAGE__->VARS;
sub run {
my (\$__self,\$__context, \$__args) = \@_;
\$__self->_initialize_page;
if( my \$cached = \$__self->_read_cache )
{
\$__self->{directives}->{OutputCache} = undef;
\$Response->Write( \$cached );
return;
}# end if()
\$__context->{page} = \$__self unless \$__self->is_masterpage;
#line 1
@{[ ${$s->source_code} ]}
@{[ join "\n\n", map { "sub $_ {\$Response->Write(q~$s->{placeholders}->{$_}~);}" } keys(%{$s->placeholders}) ]}
}
CODE
}# end if()
# Finally:
$code .= <<"CODE";
1;# return true:
CODE
unlink( $s->pm_path ) if -f $s->pm_path;
( run in 0.721 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )