summaryrefslogtreecommitdiffstats
path: root/lib/Plack/Client
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Plack/Client')
-rw-r--r--lib/Plack/Client/Backend.pm66
-rw-r--r--lib/Plack/Client/Backend/http.pm10
-rw-r--r--lib/Plack/Client/Backend/psgi_local.pm9
3 files changed, 78 insertions, 7 deletions
diff --git a/lib/Plack/Client/Backend.pm b/lib/Plack/Client/Backend.pm
new file mode 100644
index 0000000..3ba7771
--- /dev/null
+++ b/lib/Plack/Client/Backend.pm
@@ -0,0 +1,66 @@
+package Plack::Client::Backend;
+use strict;
+use warnings;
+# ABSTRACT: turns a Plack::Request into a PSGI app
+
+use Carp;
+use Scalar::Util qw(weaken);
+
+use overload '&{}' => sub { shift->as_code(@_) }, fallback => 1;
+
+=head1 SYNOPSIS
+
+ package My::Backend;
+ use base 'Plack::Client::Backend';
+
+ sub app_from_request {
+ my $self = shift;
+ my ($req) = @_;
+ return sub { ... }
+ }
+
+=head1 DESCRIPTION
+
+This is a base class for L<Plack::Client> backends. These backends are handlers
+for a particular URL scheme, and translate a L<Plack::Request> instance into a
+PSGI application coderef.
+
+=cut
+
+=method new
+
+Creates a new backend instance. Takes no parameters by default, but may be
+overridden in subclasses.
+
+=cut
+
+sub new {
+ my $class = shift;
+ bless {}, $class;
+}
+
+=method app_from_request
+
+This method is called with an argument of a L<Plack::Request> object, and
+should return a PSGI application coderef. The Plack::Request object it receives
+contains the actual env hash that will be passed to the application, so
+backends can modify that too, if they need to.
+
+=cut
+
+sub app_from_request {
+ croak "Backends must implement app_from_request";
+}
+
+=method as_code
+
+Returns a coderef which will call L</app_from_request> as a method.
+
+=cut
+
+sub as_code {
+ my $self = shift;
+ return sub { $self->app_from_request(@_) };
+}
+
+1;
diff --git a/lib/Plack/Client/Backend/http.pm b/lib/Plack/Client/Backend/http.pm
index e443385..542c2ce 100644
--- a/lib/Plack/Client/Backend/http.pm
+++ b/lib/Plack/Client/Backend/http.pm
@@ -5,6 +5,8 @@ use warnings;
use Plack::App::Proxy;
+use base 'Plack::Client::Backend';
+
=head1 SYNOPSIS
Plack::Client->new(
@@ -30,11 +32,11 @@ Constructor. Takes no arguments.
sub new {
my $class = shift;
- my %params = @_;
+ my $self = $class->SUPER::new(@_);
+
+ $self->{proxy} = Plack::App::Proxy->new->to_app;
- bless {
- proxy => Plack::App::Proxy->new->to_app,
- }, $class;
+ return $self;
}
sub _proxy { shift->{proxy} }
diff --git a/lib/Plack/Client/Backend/psgi_local.pm b/lib/Plack/Client/Backend/psgi_local.pm
index 1da572b..7bb9bcc 100644
--- a/lib/Plack/Client/Backend/psgi_local.pm
+++ b/lib/Plack/Client/Backend/psgi_local.pm
@@ -6,6 +6,8 @@ use warnings;
use Carp;
use Plack::Middleware::ContentLength;
+use base 'Plack::Client::Backend';
+
=head1 SYNOPSIS
Plack::Client->new(
@@ -43,13 +45,14 @@ A mapping of local app names to PSGI app coderefs.
sub new {
my $class = shift;
my %params = @_;
+ my $self = $class->SUPER::new(@_);
croak 'apps must be a hashref'
if ref($params{apps}) ne 'HASH';
- bless {
- apps => $params{apps},
- }, $class;
+ $self->{apps} = $params{apps};
+
+ return $self;
}
sub _apps { shift->{apps} }