The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package WebService::SOS::Observations;
use XML::Rabbit::Root 0.1.0;

add_xpath_namespace 'ows' => 'http://www.opengis.net/ows/1.1';
add_xpath_namespace 'om' => 'http://www.opengis.net/om/1.0';

has_xpath_value description => './gml:description';
has_xpath_value name => './gml:name';

has_xpath_value             lowerCorner => './om:member/om:Observation/gml:boundedBy/gml:Envelope/gml:lowerCorner'; 
has_xpath_value             upperCorner => './om:member/om:Observation/gml:boundedBy/gml:Envelope/gml:upperCorner'; 
has_xpath_value               beginTime => './om:member/om:Observation/om:samplingTime/gml:TimePeriod/gml:beginPosition'; 
has_xpath_value                 endTime => './om:member/om:Observation/om:samplingTime/gml:TimePeriod/gml:endPosition'; 
has_xpath_value               procedure => './om:member/om:Observation/om:procedure/@xlink:href'; 
has_xpath_value_list observedProperties => './om:member/om:Observation/om:observedProperty/swe:CompositePhenomenon/swe:component/@xlink:href'; 
has_xpath_value       featureOfInterest => './om:member/om:Observation/om:featureOfInterest/@xlink:href';
has_xpath_value            elementCount => './om:member/om:Observation/om:result/swe:DataArray/swe:elementCount/swe:Count/swe:value';
has_xpath_value_list          fieldList => './om:member/om:Observation/om:result/swe:DataArray/swe:elementType/swe:DataRecord/swe:field/@name';
has_xpath_value          blockSeparator => './om:member/om:Observation/om:result/swe:DataArray/swe:encoding/swe:TextBlock/@blockSeparator';
has_xpath_value        decimalSeparator => './om:member/om:Observation/om:result/swe:DataArray/swe:encoding/swe:TextBlock/@decimalSeparator';
has_xpath_value          tokenSeparator => './om:member/om:Observation/om:result/swe:DataArray/swe:encoding/swe:TextBlock/@tokenSeparator';
has_xpath_value               allValues => './om:member/om:Observation/om:result/swe:DataArray/swe:values';

has_xpath_object_list fields => './om:member/om:Observation/om:result/swe:DataArray/swe:elementType/swe:DataRecord/swe:field' => 'WebService::SOS::SWEField';

has 'exception' => (
    is => 'ro',
    isa => 'Bool',
    default => 0,
);

has 'values' => (
    is => 'ro',
    isa => 'ArrayRef',
    lazy_build => 1,
);

sub _build_values {
    my $self = shift;
    my @valueBlocks = split $self->blockSeparator, $self->allValues;
    
    my @values;
    for my $valueBlock (@valueBlocks) {
        my @value = split $self->tokenSeparator, $valueBlock;
        my %fields;
        my $fieldnum = 0;
        for my $fieldval (@value) {
            my $fieldname = @{$self->fieldList}[$fieldnum];
            $fields{$fieldname} = $fieldval;
            $fieldnum++;
        }
        push @values, \%fields;
    }
    return \@values;
}

finalize_class();