[Warszawa-pm] Plack
Zbigniew Lukasiak
zzbbyy w gmail.com
Pią, 27 Lis 2009, 03:53:07 PST
2009/11/27 piotr pogorzelski <pp w webtel.pl>:
>>
>> Ja sobie dzisiaj napisałem coś takiego:
>>
> dzieki, popatrze sobie przez weekend.
> chyba za dlugo robilem pod HTML::Mason i jakos TT srednio lubie ;)
Spoko - to właśnie o to chodzi, że to to akurat łatwo sobie podmienić.
Następny eksperyment:
### Framework ###
package PicoFramework;
use Moose;
use Template;
use Plack::Request;
use Scalar::Util qw(blessed);
has renderer => ( is => 'ro' );
has controller => ( is => 'ro' );
sub handler {
my $self = shift;
sub {
my $req = Plack::Request->new(shift);
my (undef, $action_name, @args) = split /\//, $req->path;
my $res;
if ( my $action = $self->controller->can( "serve_$action_name" ) ){
my $out = &$action( @args );
if( blessed $out and $out->isa( 'Plack::Response' ) ){
$res = $out;
}
else{
$res = $req->new_response(200);
$res->content_type('text/html');
$res->body( $out );
}
}
else{
$res = $req->new_response(404);
$res->content_type('text/plain');
$res->body( 'No such page' );
}
return $res->finalize;
};
}
### Application ###
package MyController;
sub serve_aaa {
my( @args ) = @_;
return "aaa: @args";
}
sub serve_bbb {
my( @args ) = @_;
return "bbb: @args";
}
package main;
my $app = PicoFramework->new( controller => 'MyController' );
$app->handler();
Każda metoda w MyController która zaczyna się od 'serve_' jest
interpretowana jako handle. Może ona zwracać albo tylko HTML (jako
string) albo Plack::Response (wtedy może dodawać nagłówki itp).
To oczywiście są takie wprawki, ale widać, że Plack załatwia te
wszystkie upierdliwe rzeczy, a resztę już można naprawdę dowolnie
sobie dokładać, nie tak jak w Catalyscie gdzie te wszystkie trudne
rzeczy też są załatwione ale wymusza on też w jaki sposób programować
całą resztę. Oczywiście w tej całej reszcie też są rzeczy które
fajnie byłoby mieć załatwione - ale lepiej mieć takie otwarte pole niż
tak przekomplikowane jak Catalyscie.
Z.
Więcej informacji o liście Warszawa-pm