From 55f68bf78836700f664fd44cfedcee537627ac4e Mon Sep 17 00:00:00 2001 From: Brian Phillips Date: Tue, 4 Dec 2012 22:53:27 -0600 Subject: support for anonymous middlewares --- lib/Net/HTTP/Spore.pm | 4 ++++ lib/Net/HTTP/Spore/Role/Middleware.pm | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) (limited to 'lib/Net') diff --git a/lib/Net/HTTP/Spore.pm b/lib/Net/HTTP/Spore.pm index 38ba4f7..d4fd8af 100644 --- a/lib/Net/HTTP/Spore.pm +++ b/lib/Net/HTTP/Spore.pm @@ -192,6 +192,10 @@ or only on some path $client->enable_if(sub{$_->[0]->path =~ m!/path/to/json/stuff!}, 'Format::JSON'); +For very simple middlewares, you can simple pass in an anonymous function + + $client->enable( sub { my $request = shift; ... } ); + =head2 METHODS =over 4 diff --git a/lib/Net/HTTP/Spore/Role/Middleware.pm b/lib/Net/HTTP/Spore/Role/Middleware.pm index 9ff23c0..88d64d4 100644 --- a/lib/Net/HTTP/Spore/Role/Middleware.pm +++ b/lib/Net/HTTP/Spore/Role/Middleware.pm @@ -1,6 +1,7 @@ package Net::HTTP::Spore::Role::Middleware; use Moose::Role; +use Scalar::Util qw/blessed/; has middlewares => ( is => 'rw', @@ -15,7 +16,7 @@ has middlewares => ( sub _load_middleware { my ( $self, $mw, $cond, @args ) = @_; - Class::MOP::load_class($mw); + Class::MOP::load_class($mw) unless blessed($mw); my $code = $mw->wrap( $cond, @args ); $self->_trace_msg('== enabling middleware %s', $mw); @@ -49,7 +50,18 @@ sub enable_if { confess "condition must be a code ref" if (!$cond || ref $cond ne 'CODE'); - $mw = $self->_complete_mw_name($mw); + if(ref($mw) eq 'CODE'){ # anonymous middleware + Class::MOP::load_class('Net::HTTP::Spore::Middleware'); + my $anon = Class::MOP::Class->create_anon_class( + superclasses => ['Net::HTTP::Spore::Middleware'], + methods => { + call => $mw + } + ); + $mw = $anon->new_object; + } else { + $mw = $self->_complete_mw_name($mw); + } $self->_load_middleware($mw, $cond, @args); $self; } -- cgit 1.4.1