Catalyst-View-Template-Lace
view release on metacpan or search on metacpan
lib/Catalyst/View/Template/Lace.pm view on Meta::CPAN
package Catalyst::View::Template::Lace;
our $VERSION = '0.012';
use Module::Runtime;
use Catalyst::View::Template::Lace::Renderer;
use Template::Lace::Utils;
use Moo;
extends 'Catalyst::View';
sub COMPONENT {
my ($class, $app, $args) = @_;
my $merged_args = $class->merge_config_hashes($class->config, $args);
my $merged_component_handlers = $class->merge_config_hashes(
(delete($merged_args->{component_handlers})||+{}),
$class->view_components($app, $merged_args));
my $adaptor = delete($merged_args->{factory}) || 'Catalyst::View::Template::Lace::Factory';
my $model_class = delete($merged_args->{model_class}) || $class;
my %args = (
model_class=>$model_class,
renderer_class=>'Catalyst::View::Template::Lace::Renderer',
component_handlers=>$merged_component_handlers,
init_args=>+{ %$merged_args, app=>$app },
);
$args{model_constructor} = delete($merged_args->{model_constructor})
if $merged_args->{model_constructor};
my $factory = Module::Runtime::use_module($adaptor)->new(%args);
return $factory;
}
has ctx => (is=>'ro', required=>0);
sub view_components {
my ($class, $app, $merged_args) = @_;
return +{
catalyst => {
subrequest => Template::Lace::Utils::mk_component {
require HTTP::Request;
require HTTP::Message::PSGI;
my @args = (delete $_{action});
my $method = ((delete $_{method}) || 'GET');
push @args, delete($_{parts}) if $_{parts};
push @args, delete($_{query}) if $_{query};
my $href = $_{model}->uri_for(@args);
my $http_request = HTTP::Request->new($method, $href);
my $psgi_env = HTTP::Message::PSGI::req_to_psgi($http_request);
my $psgi_response = $_{model}->ctx->psgi_app->($psgi_env);
my $http_response = HTTP::Message::PSGI::res_from_psgi($psgi_response);
my $content = $http_response->content;
if($_{at}) {
return $_->make_dom($content)->at($_{at});
}
return $content;
}
},
view => sub {
my ($name, $args, %attrs) = @_;
my $view_name = join '::', map {
$_=~s/[_-]([a-z])/\u$1/g;
ucfirst $_;
} split '-', $name;
return $app->view($view_name);
},
};
}
1;
=head1 NAME
Catalyst::View::Template::Lace - Catalyst View Adaptor for Template::Lace
=head1 SYNOPSIS
Define a View:
package MyApp::View::User;
use Moo;
extends 'Catalyst::View::Template::Lace';
has [qw/age name motto/] => (is=>'ro', required=>1);
sub template {q[
<html>
<head>
<title>User Info</title>
</head>
<body>
<dl id='user'>
<dt>Name</dt>
<dd id='name'>NAME</dd>
<dt>Age</dt>
<dd id='age'>AGE</dd>
<dt>Motto</dt>
<dd id='motto'>MOTTO</dd>
</dl>
</body>
</html>
]}
sub process_dom {
my ($self, $dom) = @_;
$dom->dl('#user', +{
age=>$self->age,
( run in 4.311 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )