package WebService::TFL::Bus::ResponseTypeRole; use Package::Variant importing => [ 'Moo::Role'], subs => [ 'has' ]; use WebService::TFL::Bus::Fields; use WebService::TFL::Bus::Types 'DateTimeMillis'; sub make_variant { my ($class,$target_package,$type) = @_; my $method = $type . '_return_fields'; my @fields = WebService::TFL::Bus::Fields->$method; for my $field (@fields) { has $field => ( is => 'ro', ( $field =~ /Time$/ ? ( isa => DateTimeMillis, coerce => DateTimeMillis->coercion, ) : () ), ); } install new_from_array => sub { my ($class,$return_set,$array) = @_; my %args; my $i=1; for my $field (@fields) { next unless exists $return_set->{$field}; $args{$field}=$array->[$i]; ++$i; } return $class->new(\%args); } } 1;