I'm currently writing a module to wrap a web service, done
asynchronously using IO::Async. Basic summary is a bunch of methods
that prepare a request, send it using Net::Async::HTTP, then yields a
Future to contain the processed result once it comes back. All nicely
simple stuff.

Having written a tonne of code I notice that basically none of it
depends on IO::Async at all, only the initial creation of the
Net::Async::HTTP object in the first place. The API it uses on that is
basically that it expects a single method that takes an HTTP::Request
object and returns a Future that eventually returns an HTTP::Response. 

  $response_future = $http->request( $request );

  $response = $response_future->get;

The whole module would work easily as well given any other type of
object with this API, including anything that is actually synchronous,
such as a tiny wrapper around LWP:

 package LWP::FutureReturning;
 use base qw( LWP::UserAgent );
 use Future;
 sub request {
   my $self = shift;
   return Future->new->done( $self->SUPER::request( @_ ) );
 }

Hey presto - have I just invented a PSGI-alike API for writing
webservices / things that use web clients, that can work synchronously,
or asynchronously using IO::Async, POE, AnyEvent, hardcoded poll(),
etc...?

I feel like I have done - or at least, I have the start of an idea that
could become it. It could do with a better name, and some more
adjustment on some concrete ideas.

Anyone any thoughts on this?

-- 
Paul "LeoNerd" Evans

leon...@leonerd.org.uk
ICQ# 4135350       |  Registered Linux# 179460
http://www.leonerd.org.uk/

Attachment: signature.asc
Description: PGP signature

Reply via email to