1 # This module is part of debbugs, and
2 # is released under the terms of the GPL version 2, or any later
3 # version (at your option). See the file README and COPYING for more
5 # Copyright 2018 by Don Armstrong <don@donarmstrong.com>.
7 package Debbugs::Collection;
11 Debbugs::Collection -- Collection base class which can generate lots of objects
24 use namespace::autoclean;
26 extends 'Debbugs::OOBase';
28 has 'members' => (is => 'bare',
32 writer => '_set_members',
33 handles => {_add => 'push',
34 members => 'elements',
43 has 'member_hash' => (traits => ['Hash'],
45 isa => 'HashRef[Int]',
47 reader => '_member_hash',
48 builder => '_build_member_hash',
49 clearer => '_clear_member_hash',
50 predicate => '_has_member_hash',
51 handles => {_add_member_hash => 'set',
52 _member_key_exists => 'exists',
53 _get_member_hash => 'get',
57 has 'universe' => (is => 'ro',
58 isa => 'Debbugs::Collection',
60 builder => '_build_universe',
61 writer => '_set_universe',
62 predicate => 'has_universe',
66 # By default, the universe is myself
72 my $limit = $self->clone();
73 # Set the universe to whatever my universe is (potentially myself)
74 $limit->_set_universe($self->universe);
75 $limit->_set_members();
76 $limit->_clear_member_hash();
77 $limit->add($self->universe->get_or_create(@_));
87 # we assume that if it's already a blessed reference, that it's the right
88 if (blessed($_[$i])) {
92 elsif ($self->_member_key_exists($_[$i])) {
98 # create and add by key
99 @return[@need_to_add] =
100 $self->add_by_key(@_[@need_to_add]);
102 $self->get(@_[@exists]);
106 has 'constructor_args' => (is => 'rw',
113 # we'll assume that add does the right thing. around this in subclasses
114 return $self->add(@_);
120 for my $member (@_) {
121 if ($self->exists($member)) {
124 $self->_add($member);
125 $self->_add_member_hash($self->member_key($member),
129 $self->_add(@members_to_add);
130 return @members_to_add;
135 return $self->_get_member($self->_get_member_hash(@_));
145 return $self->_member_key_exists($self->member_key($_[0]));
148 sub _build_member_hash {
152 for my $member ($self->members) {
153 $hash->{$self->member_key($member)} =
159 __PACKAGE__->meta->make_immutable;
165 # indent-tabs-mode: nil
166 # cperl-indent-level: 4