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 )