From 42d3c34351474c14cef06803c18a2b4175495338 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Tue, 12 Oct 2010 16:11:06 +0200 Subject: add enable_if feature + tests --- lib/Net/HTTP/Spore/Middleware.pm | 8 ++++++-- lib/Net/HTTP/Spore/Role/Middleware.pm | 36 ++++++++++++++++++++++++----------- 2 files changed, 31 insertions(+), 13 deletions(-) (limited to 'lib/Net/HTTP') diff --git a/lib/Net/HTTP/Spore/Middleware.pm b/lib/Net/HTTP/Spore/Middleware.pm index 0b8584c..6d284b5 100644 --- a/lib/Net/HTTP/Spore/Middleware.pm +++ b/lib/Net/HTTP/Spore/Middleware.pm @@ -18,13 +18,17 @@ sub response_cb { } sub wrap { - my ($self, @args) = @_; + my ($self, $cond, @args) = @_; if (!ref $self) { $self = $self->new(@args); } + return sub { - $self->call(@_); + my $request = shift; + if ($cond->($request)) { + $self->call($request, @_); + } }; } diff --git a/lib/Net/HTTP/Spore/Role/Middleware.pm b/lib/Net/HTTP/Spore/Role/Middleware.pm index dd2c1c5..60f4703 100644 --- a/lib/Net/HTTP/Spore/Role/Middleware.pm +++ b/lib/Net/HTTP/Spore/Role/Middleware.pm @@ -3,36 +3,50 @@ package Net::HTTP::Spore::Role::Middleware; use Moose::Role; has middlewares => ( - is => 'rw', - isa => 'ArrayRef', - traits => ['Array'], - lazy => 1, - default => sub { [] }, + is => 'rw', + isa => 'ArrayRef', + traits => ['Array'], + lazy => 1, + default => sub { [] }, auto_deref => 1, - handles => { _add_middleware => 'push', _filter_middlewares => 'grep'}, + handles => { _add_middleware => 'push', _filter_middlewares => 'grep' }, ); sub _load_middleware { - my ( $self, $mw, @args ) = @_; + my ( $self, $mw, $cond, @args ) = @_; Class::MOP::load_class($mw); - my $code = $mw->wrap( @args ); + my $code = $mw->wrap( $cond, @args ); $self->_add_middleware($code); } -sub enable { - my ($self, $mw, @args) = @_; +sub _complete_mw_name { + my ($self, $mw) = @_; if ($mw !~ /(?:^\+|Net\:\:HTTP\:\:Spore\:\:Middleware)/) { $mw = "Net::HTTP::Spore::Middleware::".$mw; } - $self->_load_middleware($mw, @args); + + return $mw; +} + +sub enable { + my ($self, $mw, @args) = @_; + + confess "middleware name is missing" unless $mw; + + $self->enable_if(sub{1}, $mw, @args); $self; } sub enable_if { my ($self, $cond, $mw, @args) = @_; + + confess "condition must be a code ref" if (!$cond || ref $cond ne 'CODE'); + + $mw = $self->_complete_mw_name($mw); + $self->_load_middleware($mw, $cond, @args); $self; } -- cgit 1.4.1