HTTP-Engine-Middleware
view release on metacpan or search on metacpan
lib/HTTP/Engine/Middleware.pm view on Meta::CPAN
local *before_handle = sub { push @before_handles, @_ };
local *after_handle = sub { push @after_handles, @_ };
local *middleware_method = sub {
my($method, $code) = @_;
my $method_class = $self->method_class;
if ($method =~ /^(.+)\:\:([^\:]+)$/) {
($method_class, $method) = ($1, $2);
}
return unless $method_class;
no strict 'refs';
*{"$klass\::$method"} = $code;
*{"$method_class\::$method"} = $code;
};
Any::Moose::load_class($klass);
no strict 'refs';
*{"${klass}::_before_handles"} = sub () { @before_handles };
*{"${klass}::_after_handles"} = sub () { @after_handles };
}
sub is_class_loaded {
my $class = shift;
return Any::Moose::is_class_loaded($class);
}
sub instance_of {
my($self, $name) = @_;
my $stuff = $self->_instance_of->{$name};
return wantarray ? @{$stuff} : $stuff->[0];
}
sub handler {
my($self, $handle) = @_;
sub {
my $req = shift;
my $res;
my @run_middlewares;
LOOP:
for my $instance (@{ $self->_instance_ary_ex }) {
for my $code (@{ $instance->before_handles }) {
my $ret = $code->($self, $instance, $req);
if ($ret->isa('HTTP::Engine::Response')) {
$res = $ret;
last LOOP;
}
$req = $ret;
}
push @run_middlewares, $instance;
}
my $msg;
unless ($res) {
$self->diecatch(0);
local $@;
eval {
$res = $handle->($req);
$self->diecatch(0); # yes! i'm still alive!
};
$msg = $@ if !$self->diecatch && $@;
}
die $msg if $msg;
for my $instance (reverse @run_middlewares) {
for my $code (reverse @{ $instance->after_handles }) {
$res = $code->($self, $instance, $req, $res);
}
}
$res;
};
}
1;
__END__
=for stopwords Daisuke Maki dann hidek marcus nyarla API middlewares
=encoding utf8
=head1 NAME
HTTP::Engine::Middleware - middlewares distribution
=head1 WARNING! WARNING!
THIS MODULE IS IN ITS ALPHA QUALITY. THE API MAY CHANGE IN THE FUTURE
=head1 SYNOPSIS
simply
my $mw = HTTP::Engine::Middleware->new;
$mw->install(qw/ HTTP::Engine::Middleware::DebugScreen HTTP::Engine::Middleware::ReverseProxy /);
HTTP::Engine->new(
interface => {
module => 'YourFavoriteInterfaceHere',
request_handler => $mw->handler( \&handler ),
}
)->run();
method injection middleware
my $mw = HTTP::Engine::Middleware->new({ method_class => 'HTTP::Engine::Request' });
$mw->install(qw/ HTTP::Engine::Middleware::DebugScreen HTTP::Engine::Middleware::ReverseProxy /);
HTTP::Engine->new(
interface => {
module => 'YourFavoriteInterfaceHere',
request_handler => $mw->handler(sub {
my $req = shift;
HTTP::Engine::Response->new( body => $req->mobile_attribute );
})
}
)->run();
=head1 DESCRIPTION
HTTP::Engine::Middleware is official middlewares distribution of HTTP::Engine.
( run in 0.639 second using v1.01-cache-2.11-cpan-71847e10f99 )