HTTP-Engine-Middleware
view release on metacpan or search on metacpan
lib/HTTP/Engine/Middleware.pm view on Meta::CPAN
package HTTP::Engine::Middleware;
use 5.00800;
use Any::Moose;
use Any::Moose (
'::Util' => [qw/apply_all_roles/],
);
our $VERSION = '0.22';
use Carp ();
has 'middlewares' => (
is => 'ro',
isa => 'ArrayRef',
default => sub { +[] },
);
has '_instance_of' => (
is => 'rw',
isa => 'HashRef',
default => sub { +{} },
);
has '_instance_ary_ex' => (
is => 'rw',
isa => 'ArrayRef',
default => sub { +[] },
);
has 'method_class' => (
is => 'ro',
isa => 'Str',
);
# this flag means...
# 13:06 Yappo:> ã©ã£ãã® middleware ã die ã catch ããã®ã§ HEM core 㯠die ã rethrow ããªããã¼
# 13:06 Yappo:> ã£ã¦äºãã
has 'diecatch' => (
is => 'rw',
isa => 'Bool',
);
sub init_class {
my $klass = shift;
my $meta = any_moose('::Meta::Class')->initialize($klass);
$meta->superclasses(any_moose('::Object'))
unless $meta->superclasses;
no strict 'refs';
no warnings 'redefine';
*{ $klass . '::meta' } = sub { $meta };
}
sub import {
my($class, ) = @_;
my $caller = caller;
return unless $caller =~ /(?:\:)?Middleware\:\:.+/;
strict->import;
warnings->import;
init_class($caller);
any_moose()->import({ into_level => 1 });
no strict 'refs';
*{"$caller\::__MIDDLEWARE__"} = sub {
use strict;
my $caller = caller(0);
__MIDDLEWARE__($caller);
};
*{"$caller\::before_handle"} = sub (&) { goto \&before_handle };
*{"$caller\::after_handle"} = sub (&) { goto \&after_handle };
*{"$caller\::middleware_method"} = sub { goto \&middleware_method };
}
sub __MIDDLEWARE__ {
my ( $caller, ) = @_;
Any::Moose::unimport;
apply_all_roles( $caller, 'HTTP::Engine::Middleware::Role' );
$caller->meta->make_immutable( inline_destructor => 1 );
"MIDDLEWARE";
}
BEGIN {
no strict 'refs';
for my $meth (
qw(before_handle after_handle middleware_method)
)
{
*{__PACKAGE__ . "::$meth"} = sub {
Carp::croak("Can't call ${meth} function outside Middleware's load phase");
};
}
};
# this method's return value is indefinite.
sub install {
my($self, @middlewares) = @_;
my $args = $self->_build_args(@middlewares);
$self->_create_middleware_instance($args);
}
# this module accepts
# $mw->install(qw/HTTP::Engine::Middleware::Foo/);
# and
# $mw->install('HTTP::Engine::Middleware::Foo' => { arg1 => 'foo'});
sub _build_args {
my $self = shift;
# basis of Data::OptList
my @middlewares;
my $max = scalar(@_);
for (my $i = 0; $i < $max ; $i++) {
if ($i + 1 < $max && ref($_[$i + 1])) {
( run in 2.221 seconds using v1.01-cache-2.11-cpan-140bd7fdf52 )