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 predicate => '_has_members',
34 handles => {_add => 'push',
35 members => 'elements',
47 return [$self->members];
50 has 'member_hash' => (traits => ['Hash'],
52 isa => 'HashRef[Int]',
54 reader => '_member_hash',
55 builder => '_build_member_hash',
56 clearer => '_clear_member_hash',
57 predicate => '_has_member_hash',
58 writer => '_set_member_hash',
59 handles => {_add_member_hash => 'set',
60 _member_key_exists => 'exists',
61 _get_member_hash => 'get',
65 has 'universe' => (is => 'ro',
66 isa => 'Debbugs::Collection',
68 builder => '_build_universe',
69 writer => '_set_universe',
70 predicate => 'has_universe',
74 # By default, the universe is myself
80 my $new = bless { %{$self} }, ref $self;
81 if ($self->_has_members) {
82 $new->_set_members([$self->members]);
84 if ($self->_has_member_hash) {
85 $new->_set_member_hash({%{$self->_member_hash}})
92 my $limit = $self->clone();
93 # Set the universe to whatever my universe is (potentially myself)
94 # $limit->_set_universe($self->universe);
95 $limit->_set_members([]);
96 $limit->_clear_member_hash();
97 $limit->add($self->universe->get_or_create(@_)) if @_;
108 # we assume that if it's already a blessed reference, that it's the right
109 if (blessed($_[$i])) {
113 elsif ($self->_member_key_exists($_[$i])) {
116 push @need_to_add,$i;
119 # create and add by key
121 @return[@need_to_add] =
122 $self->add_by_key(@_[@need_to_add]);
126 $self->get(@_[@exists]);
128 # if we've only been asked to get or create one thing, then it's expected
129 # that we are returning only one thing
136 has 'constructor_args' => (is => 'rw',
143 # we'll assume that add does the right thing. around this in subclasses
144 return $self->add(@_);
150 for my $member (@_) {
151 if (not defined $member) {
152 confess("Undefined member to add");
154 push @members_added,$member;
155 if ($self->exists($member)) {
158 $self->_add($member);
159 $self->_add_member_hash($self->member_key($member),
163 return @members_added;
168 return $self->_get_member($self->_get_member_hash(@_));
178 return $self->_member_key_exists($self->member_key($_[0]));
181 sub _build_member_hash {
185 for my $member ($self->members) {
186 $hash->{$self->member_key($member)} =
192 __PACKAGE__->meta->make_immutable;
198 # indent-tabs-mode: nil
199 # cperl-indent-level: 4