X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FCollection.pm;h=c1faa6f6804c745d02649072d9e94b520ccc26d5;hb=c0375a86e3710174d12844848b99ffcf81ecd816;hp=529056391886d862fd3211de4ec2c5d745c96009;hpb=7908c761e8b425f92178aa73f3aba1edce3ab438;p=debbugs.git diff --git a/Debbugs/Collection.pm b/Debbugs/Collection.pm index 5290563..c1faa6f 100644 --- a/Debbugs/Collection.pm +++ b/Debbugs/Collection.pm @@ -49,19 +49,40 @@ sub members_ref { has 'member_hash' => (traits => ['Hash'], is => 'bare', - isa => 'HashRef[Int]', + # really a HashRef[Int], but type checking is too slow + isa => 'HashRef', lazy => 1, reader => '_member_hash', builder => '_build_member_hash', clearer => '_clear_member_hash', predicate => '_has_member_hash', writer => '_set_member_hash', - handles => {_add_member_hash => 'set', + handles => {# _add_member_hash => 'set', _member_key_exists => 'exists', _get_member_hash => 'get', }, ); +# because _add_member_hash needs to be fast, we are overriding the default set +# method which is very safe but slow, because it makes copies. +sub _add_member_hash { + my ($self,@kv) = @_; + pairmap { + defined($a) + or $self->meta-> + throw_error("Hash keys passed to _add_member_hash must be defined" ); + ($b eq int($b)) or + $self->meta-> + throw_error("Values passed to _add_member_hash must be integer"); + } @kv; + my @return; + while (my ($key, $value) = splice @kv, 0, 2 ) { + push @return, + $self->{member_hash}{$key} = $value + } + wantarray ? return @return: return $return[0]; +} + has 'universe' => (is => 'ro', isa => 'Debbugs::Collection', required => 1, @@ -87,9 +108,14 @@ sub clone { return $new; } +sub _shallow_clone { + my $self = shift; + return bless { %{$self} }, ref $self; +} + sub limit { my $self = shift; - my $limit = $self->clone(); + my $limit = $self->_shallow_clone(); # Set the universe to whatever my universe is (potentially myself) # $limit->_set_universe($self->universe); $limit->_set_members([]); @@ -189,8 +215,14 @@ sub _build_member_hash { return $hash; } -__PACKAGE__->meta->make_immutable; +sub CARP_TRACE { + my $self = shift; + return 'Debbugs::Collection={n_members='.$self->count().'}'; +} + +__PACKAGE__->meta->make_immutable; +no Mouse; 1; __END__