+ package Mojo::UserAgent::Promises;
+ # use Promises qw[deferred]; <-- Kudos
+ use Mojo::Base 'Mojo::UserAgent';
+ use Mojo::Util qw(monkey_patch);
+ my $promise = Mojo::Promise->new;
+ $self->SUPER::start($tx, sub { $promise->resolve($self, $tx) });
+ for my $name (qw(DELETE GET HEAD OPTIONS PATCH POST PUT)) {
+ monkey_patch __PACKAGE__, sprintf("a%s", lc $name), sub {
+ my $cb = ref $_[-1] eq 'CODE' ? pop : undef;
+ return $self->start($self->build_tx($name, @_), $cb);
+my $ua = Mojo::UserAgent::Promises->new->max_redirects(4);
+push(@promises, $ua->aget("http://mojolicio.us")->then(sub {
+ say("Yay: " . $_[1]->res->dom->at('title')->text);
+push(@promises, $ua->aget("http://slashdot.org")->then(sub {
+ say("Skippie: " . $_[1]->res->dom->at('title')->text);
+Mojo::Promise->all(@promises)->then(sub {
+Mojo::IOLoop->start unless Mojo::IOLoop->is_running;