Skip to content

Commit

Permalink
build request handler with Builder.
Browse files Browse the repository at this point in the history
  • Loading branch information
dann committed Oct 2, 2009
1 parent 0701b26 commit ebb1395
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 20 deletions.
4 changes: 2 additions & 2 deletions config/example.psgi
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ my $request_handler = sub {
$res->code(200); $res->code(200);
$res->header( 'Content-Type' => 'text/html' ); $res->header( 'Content-Type' => 'text/html' );
$res->body( ["Hello World"] ); $res->body( ["Hello World"] );
$res->finalize; return $res;
}; };


my $engine = PlackX::Engine->new( my $engine = PlackX::Engine->new(
Expand All @@ -20,7 +20,7 @@ my $engine = PlackX::Engine->new(
}, },
request_handler => $request_handler, request_handler => $request_handler,
middlewares => middlewares =>
[ { module => "AccessLog::Timed" }, { module => "Static" } ], [ { module => "Plack::Middleware::AccessLog::Timed" }, { module => "Plack::Middleware::Static" } ],
} }
); );


Expand Down
44 changes: 26 additions & 18 deletions lib/PlackX/Engine.pm
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ our $VERSION = '0.01';


use Class::Accessor "antlers"; use Class::Accessor "antlers";
use Plack::Loader; use Plack::Loader;
use Plack::Middleware;
use Plack::Builder;
use Plack::Request; use Plack::Request;
use PlackX::Engine::Builder;


has server => ( is => "rw", isa => "HashRef" ); has server => ( is => "rw", isa => "HashRef" );
has request_handler => ( is => "rw", isa => "CodeRef" ); has request_handler => ( is => "rw", isa => "CodeRef" );
Expand All @@ -33,27 +32,37 @@ sub _build_server_instance {
} }


sub _build_request_handler { sub _build_request_handler {
my $self = shift; my $self = shift;
my $request_handler = sub { my $app = $self->_build_app;
$self->_wrap_with_middlewares($app);
}

sub _build_app {
my $self = shift;
return sub {
my $env = shift; my $env = shift;
my $req = $self->build_request($env); my $req = $self->build_request($env);
return $self->{request_handler}->($req); my $res = $self->{request_handler}->($req);
$res->finalize;
}; };
$self->_wrap_with_middlewares($request_handler);
} }


sub _wrap_with_middlewares { sub _wrap_with_middlewares {
my ( $self, $request_handler ) = @_; my ( $self, $request_handler ) = @_;
for my $middleware ( reverse @{ $self->{middlewares} || [] } ) { my $builder = PlackX::Engine::Builder->new;
my $sub = $middleware->{module};
my $subclass = $sub =~ s/^\+// ? $sub : "Plack::Middleware::$sub"; # orz. this code should be moved to PlackX::Engine::Builder
eval "use $subclass"; for my $middleware ( @{ $self->{middlewares} || [] } ) {
die $@ if $@; my $middleware_name = $middleware->{module};

$builder->add_middleware(
$request_handler = $subclass->wrap( $request_handler, $middleware_name,
%{ $middleware->{args} || {} } ); sub {
$middleware_name->wrap( @{ $middleware->{args} || [] },
$_[0] );
}
);
} }
$request_handler; $builder->to_app($request_handler);
} }


sub build_request { sub build_request {
Expand Down Expand Up @@ -82,7 +91,6 @@ PlackX::Engine -
$res->code(200); $res->code(200);
$res->header( 'Content-Type' => 'text/html' ); $res->header( 'Content-Type' => 'text/html' );
$res->body( ["Hello World"] ); $res->body( ["Hello World"] );
$res->finalize;
}; };
my $engine = PlackX::Engine->new( my $engine = PlackX::Engine->new(
Expand All @@ -96,8 +104,8 @@ PlackX::Engine -
}, },
request_handler => $request_handler, request_handler => $request_handler,
middlewares => [ middlewares => [
{ module => "AccessLog::Timed" }, { module => "Plack::Middleware::AccessLog::Timed" },
{ module => "Static" } { module => "Plack::Middleware::Static" }
], ],
} }
); );
Expand Down
32 changes: 32 additions & 0 deletions lib/PlackX/Engine/Builder.pm
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,32 @@
package PlackX::Engine::Builder;
use strict;
use warnings;
use base qw/Class::Accessor::Fast/;
__PACKAGE__->mk_accessors(qw/middlewares/);

sub new {
my ( $class, $middlewares ) = @_;
$middlewares ||= [];
my $self = bless { middlewares => $middlewares }, $class;
return $self;
}

sub add_middleware {
my ( $self, $middleware_name, $middleware ) = @_;
eval "use $middleware_name";
die $@ if $@;

push @{ $self->{middlewares} }, $middleware;
}

sub to_app {
my ( $self, $app ) = @_;
for my $mw ( reverse @{ $self->{middlewares} } ) {
$app = $mw->($app);
}
$app;
}

1;

__END__
39 changes: 39 additions & 0 deletions lib/PlackX/Engine/Builder/Declare.pm
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,39 @@
package PlackX::Engine::Builder::Declare;
use strict;
use PlackX::Engine::Builder;

sub import {
my $caller = caller;

no strict 'refs';
no warnings 'redefine';

*{ $caller . '::builder' } = \&builder;
*{ $caller . '::enable' } = \&enable;
}

sub builder(&) {
my $block = shift;

my $builder = PlackX::Engine::Builder->new;
no warnings 'redefine';

local *enable = enable_middleware($builder);

my $app = $block->();
$builder->to_app($app);
}

sub enable_middleware {
my $builder = shift;

return sub {
my ( $middleware, @args ) = @_;
$builder->add_middleware( $middleware,
sub { $middleware->wrap( @args, $_[0] ); } );
};
}

1;

__END__

0 comments on commit ebb1395

Please sign in to comment.