]> git.donarmstrong.com Git - debbugs.git/blob - Debbugs/Collection/Bug.pm
Add users to a collection
[debbugs.git] / Debbugs / Collection / Bug.pm
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
4 # information.
5 # Copyright 2018 by Don Armstrong <don@donarmstrong.com>.
6
7 package Debbugs::Collection::Bug;
8
9 =head1 NAME
10
11 Debbugs::Collection::Bug -- Bug generation factory
12
13 =head1 SYNOPSIS
14
15
16 =head1 DESCRIPTION
17
18
19
20 =cut
21
22 use Mouse;
23 use strictures 2;
24 use namespace::autoclean;
25 use Debbugs::Common qw(make_list hash_slice);
26 use Debbugs::OOTypes;
27 use Debbugs::Status qw(get_bug_statuses);
28 use Debbugs::Collection::Package;
29 use Debbugs::Collection::Correspondent;
30
31 use Debbugs::Bug;
32
33 extends 'Debbugs::Collection';
34
35 has '+members' => (isa => 'ArrayRef[Bug]');
36 has 'package_collection' =>
37     (is => 'ro',
38      isa => 'Debbugs::Collection::Package',
39      builder => '_build_package_collection',
40      lazy => 1,
41     );
42
43 sub _build_package_collection {
44     my $self = shift;
45     return Debbugs::Collection::Package->new($self->has_schema?(schema => $self->schema):());
46 }
47
48 has 'correspondent_collection' =>
49     (is => 'ro',
50      isa => 'Debbugs::Collection::Correspondent',
51      builder => '_build_correspondent_collection',
52      lazy => 1,
53     );
54
55 sub _build_correspondent_collection {
56     my $self = shift;
57     return Debbugs::Collection::Correspondent->new($self->has_schema?(schema => $self->schema):());
58 }
59
60 has 'users' =>
61     (is => 'ro',
62      isa => 'ArrayRef[Debbugs::User]',
63      traits => ['Array'],
64      default => sub {[]},
65      handles => {'add_user' => 'push'},
66     );
67
68 sub BUILD {
69     my $self = shift;
70     my $args = shift;
71     if (exists $args->{bugs}) {
72         $self->add(
73             $self->_member_constructor(bugs => $args->{bugs}
74                                       ));
75     }
76 }
77
78 sub _member_constructor {
79     # handle being called $self->_member_constructor;
80     my $self = shift;
81     my %args = @_;
82     my @return;
83     my $schema;
84     $schema = $self->schema if $self->has_schema;
85
86     if (defined $schema) {
87         my $statuses = get_bug_statuses(bug => [make_list($args{bugs})],
88                                         schema => $schema,
89                                        );
90         while (my ($bug, $status) = each %{$statuses}) {
91             push @return,
92                 Debbugs::Bug->new(bug => $bug,
93                                   status => $status,
94                                   schema => $schema,
95                                   package_collection =>
96                                   $self->package_collection->universe,
97                                   bug_collection =>
98                                   $self->universe,
99                                   correspondent_collection =>
100                                   $self->correspondent_collection->universe,
101                                   @{$args{constructor_args}//[]},
102                                  );
103         }
104     } else {
105         for my $bug (make_list($args{bugs})) {
106             push @return,
107                 Debbugs::Bug->new(bug => $bug,
108                                   package_collection =>
109                                   $self->package_collection->universe,
110                                   bug_collection =>
111                                   $self->universe,
112                                   correspondent_collection =>
113                                   $self->correspondent_collection->universe,
114                                   @{$args{constructor_args}//[]},
115                                  );
116         }
117     }
118     return @return;
119 }
120
121 around add_by_key => sub {
122     my $orig = shift;
123     my $self = shift;
124     my @members =
125         $self->_member_constructor(bugs => [@_],
126                                   );
127     return $self->$orig(@members);
128 };
129
130 sub member_key {
131     return $_[1]->bug;
132 }
133
134 sub load_related_packages_and_versions {
135     my $self = shift;
136     my @related_packages_and_versions =
137         $self->map(sub {$_->related_packages_and_versions});
138     $self->package_collection->
139         add_packages_and_versions(@related_packages_and_versions);
140 }
141
142 __PACKAGE__->meta->make_immutable;
143
144 1;
145
146 __END__
147 # Local Variables:
148 # indent-tabs-mode: nil
149 # cperl-indent-level: 4
150 # End: