package WebService::TFL::Bus::ResponseTypeRole; use MooseX::Role::Parameterized; use WebService::TFL::Bus::Fields; use WebService::TFL::Bus::Types 'DateTimeMillis'; parameter type => ( isa => 'Str', required => 1, ); role { my $p = shift; my $method = $p->type . '_return_fields'; my @fields = WebService::TFL::Bus::Fields->$method; for my $field (@fields) { has $field => ( is => 'ro', ( $field =~ /Time$/ ? ( isa => DateTimeMillis, coerce => 1, ) : () ), ); } method 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;