refactor dispatch some more
[catagits/Web-Simple.git] / lib / Web / Dispatch / Wrapper.pm
index 5ff6068..65739fd 100644 (file)
@@ -1,14 +1,46 @@
 package Web::Dispatch::Wrapper;
 
 use strictures 1;
+use Moo;
+use Exporter 'import';
+
+our @EXPORT = qw(dispatch_wrapper redispatch_to response_filter);
+
+extends 'Plack::Middleware';
+
+has 'wrapper' => (is => 'ro', required => 1);
+
+sub dispatch_wrapper (&) {
+  my ($code) = @_;
+  __PACKAGE__->from_code($code);
+}
 
 sub from_code {
   my ($class, $code) = @_;
-  bless(\$code, $class);
+  $class->new(wrapper => $code);
+}
+
+sub redispatch_to {
+  my ($new_path) = @_;
+  __PACKAGE__->from_code(sub {
+    $_[1]->({ %{$_[0]}, PATH_INFO => $new_path });
+  });
+}
+
+sub response_filter (&) {
+  my ($code) = @_;
+  __PACKAGE__->from_code(sub {
+    my @result = $_[1]->($_[0]);
+    if (@result) {
+      $code->(@result);
+    } else {
+      ()
+    }
+  });
 }
 
-sub wrap {
-  my $code = ${$_[0]};
+sub to_app {
+  my $code = $_[0]->wrapper;
   my $app = $_[1];
   sub { $code->($_[0], $app) }
 }