package WebService::TFL::Bus::Response;
use Moo;
use Class::Load 'load_class';
use Type::Utils 'class_type';
use Types::Standard -all;
use JSON;
use namespace::autoclean;
sub line_class {
"WebService::TFL::Bus::Response::$_[0]";
}
my %line_map = (
0 => 'Stop',
1 => 'Prediction',
2 => 'FlexibleMessage',
3 => 'BaseVersion',
4 => 'URAVersion',
);
for my $field (values %line_map) {
my $class = line_class($field);
load_class($class);
has $field => (
is => 'ro',
isa => ArrayRef[class_type { class => $class }],
);
}
sub new_from_json {
my ($class,$return_list,$json) = @_;
my $parser = JSON->new->utf8;
my %return_set;@return_set{@$return_list}=();
unless (%return_set) {
@return_set{qw(StopPointName LineName EstimatedTime)}=();
}
my %args;
while ($json) {
my ($array,$consumed) = $parser->decode_prefix($json);
my $array_type = $line_map{$array->[0]};
my $line_class = line_class($array_type);
push @{$args{$array_type}},
$line_class->new_from_array(\%return_set,$array);
substr($json,0,$consumed)='';
}
return $class->new(\%args);
}
1;