package WebService::TFL::Bus; use Moo; use Types::URI 'Uri'; use Type::Utils 'duck_type'; use WebService::TFL::Bus::Response; use namespace::clean; has user_agent => ( isa => duck_type(['get']), is => 'lazy', ); sub _build_user_agent { require LWP::UserAgent; my $ua = LWP::UserAgent->new(); $ua->env_proxy; return $ua; } 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 }, ); sub request { my ($self,$stop_id) = @_; my $uri = $self->uri->clone; $uri->path_segments( map { $_ eq '__' ? $stop_id : $_ } $uri->path_segments ); my $http_response = $self->user_agent->get($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;