package WebService::TFL::Bus; use Moo; use Types::URI 'Uri'; use Types::Standard -types; use Future::AsyncAwait; use WebService::TFL::Bus::Response; use namespace::clean; has user_agent => ( isa => HasMethods['do_request'], is => 'ro', required => 1, ); has uri => ( isa => Uri, is => 'ro', coerce => Uri->coercion, default => 'https://api.tfl.gov.uk/StopPoint/__/Arrivals', ); has parser => ( is => 'lazy', builder => sub { JSON->new->utf8 }, ); async sub request { my ($self,$stop_id) = @_; my $uri = $self->uri->clone; $uri->path_segments( map { $_ eq '__' ? $stop_id : $_ } $uri->path_segments ); my $http_response = await $self->user_agent->do_request(uri => $uri); if ($http_response->is_success) { my $json = $http_response->content; return WebService::TFL::Bus::Response->new_from_response( $self->parser->decode($json) ); } else { die $http_response->status_line; } } 1;