]> git.donarmstrong.com Git - debbugs.git/blob - Debbugs/Collection/Bug.pm
08f7a66d078f43fd6f48f3b29ffedfbf80cc5e8b
[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
29 extends 'Debbugs::Collection';
30
31 has '+members' => (isa => 'ArrayRef[Bug]');
32 has 'package_collection' => (is => 'rw',
33                           isa => 'Debbugs::Collection::Package',
34                           default => sub {Debbugs::Collection::Package->new()}
35                          );
36
37 around BUILDARGS => sub {
38     my $orig = shift;
39     my $class = shift;
40
41     my %args;
42     if (@_==1 and ref($_[0]) eq 'HASH') {
43         %args = %{$_[0]};
44     } else {
45         %args = @_;
46     }
47     $args{members} //= [];
48     if (exists $args{bugs}) {
49         push @{$args{members}},
50             _member_constructor(bugs => $args{bugs},
51                                 hash_slice(%args,qw(schema constructor_args)),
52                                );
53         delete $args{bugs};
54     }
55     return $class->$orig(%args);
56 };
57
58 sub _member_constructor {
59     # handle being called $self->_member_constructor;
60     if ((@_ % 2) == 1) {
61         shift;
62     }
63     my %args = @_;
64     my @return;
65     if (exists $args{schema}) {
66         my $statuses = get_bug_statuses(bug => [make_list($args{bugs})],
67                                         schema => $args{schema},
68                                        );
69         while (my ($bug, $status) = each %{$statuses}) {
70             push @return,
71                 Debbugs::Bug->new(bug=>$bug,
72                                   status=>$status,
73                                   schema=>$args{schema},
74                                   @{$args{constructor_args}//[]},
75                                  );
76         }
77     } else {
78         for my $bug (make_list($args{bugs})) {
79             push @return,
80                 Debbugs::Bug->new(bug => $bug,
81                                   @{$args{constructor_args}//[]},
82                                  );
83         }
84     }
85     return @return;
86 }
87
88 around add_by_key => sub {
89     my $orig = shift;
90     my $self = shift;
91     my @members =
92         _member_constructor(bugs => [@_],
93                             $self->has_schema?(schema => $self->schema):(),
94                             constructor_args => $self->constructor_args,
95                            );
96     return $self->$orig(@members);
97 };
98
99 sub member_key {
100     return $_[1]->bug;
101 }
102
103 __PACKAGE__->meta->make_immutable;
104
105 1;
106
107 __END__
108 # Local Variables:
109 # indent-tabs-mode: nil
110 # cperl-indent-level: 4
111 # End: