use strict; use warnings; package MockAsync; sub new { my ($class, %params) = @_; return bless \%params, $class; } sub add { my ($self, $request) = @_; push @{$self->{sources}}, $request; } sub wait_for_next_response { my ($self) = @_; return if ! @{$self->{sources}}; return splice @{$self->{sources}}, rand @{$self->{sources}}, 1; } package MockRequest; sub new { my ($class, %params) = @_; return bless \%params, $class; } sub uri { my ($self) = @_; return $self->{GET}; } package main; my $async = MockAsync->new; $async->add(MockRequest->new(GET => 'http://www.perl.org/')); $async->add(MockRequest->new(GET => 'http://www.ecclestoad.co.uk/')); while (my $response = $async->wait_for_next_response) { printf "Response from %s\n", $response->uri (); }