# You may distribute under the terms of the GNU General Public License # # (C) Paul Evans, 2008-2010 -- leonerd@leonerd.org.uk package Circle::Rule::Resultset; use strict; use warnings; use Carp; sub new { my $class = shift; return bless {}, $class; } sub get_result { my $self = shift; my ( $name ) = @_; carp "No result '$name'" unless exists $self->{$name}; return $self->{$name}; } sub push_result { my $self = shift; my ( $name, $value ) = @_; if( !exists $self->{$name} ) { $self->{$name} = [ $value ]; } elsif( ref $self->{$name} eq "ARRAY" ) { push @{ $self->{$name} }, $value; } else { croak "Expected '$name' to be an ARRAY result"; } } sub merge_from { my $self = shift; my ( $other ) = @_; foreach my $name ( %$other ) { my $otherval = $other->{$name}; if( !$self->{$name} ) { $self->{$name} = $otherval; next; } my $myval = $self->{$name}; # Already had it - type matches? if( ref $myval ne ref $otherval ) { croak "Cannot merge; '$name' has different result types"; } my $type = ref $myval; if( ref $myval eq "ARRAY" ) { push @$myval, @$otherval; } else { croak "Don't know how to handle result type '$name' ($type)"; } } } 0x55AA;