summary refs log tree commit diff
path: root/lib/Net/HTTP/Spore
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Net/HTTP/Spore')
-rw-r--r--lib/Net/HTTP/Spore/Role/Middleware.pm16
1 files changed, 14 insertions, 2 deletions
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;
 }