package WebService::TFL::Bus::Response; use Moo; use Class::Load 'load_class'; use Type::Utils -all; 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;