X-Git-Url: https://git.donarmstrong.com/?p=debbugs.git;a=blobdiff_plain;f=Debbugs%2FCollection%2FBug.pm;h=440c678576d81a1d51c35cccd0dd8bf16c71da80;hp=08f7a66d078f43fd6f48f3b29ffedfbf80cc5e8b;hb=c1c1e02743f7664af1fd3b0e9802eb953d29478a;hpb=0e16a5214d3617d0df54712869b2da0f3c64fcdb diff --git a/Debbugs/Collection/Bug.pm b/Debbugs/Collection/Bug.pm index 08f7a66..440c678 100644 --- a/Debbugs/Collection/Bug.pm +++ b/Debbugs/Collection/Bug.pm @@ -25,52 +25,79 @@ use namespace::autoclean; use Debbugs::Common qw(make_list hash_slice); use Debbugs::OOTypes; use Debbugs::Status qw(get_bug_statuses); +use Debbugs::Collection::Package; +use Debbugs::Collection::Correspondent; + +use Debbugs::Bug; extends 'Debbugs::Collection'; has '+members' => (isa => 'ArrayRef[Bug]'); -has 'package_collection' => (is => 'rw', - isa => 'Debbugs::Collection::Package', - default => sub {Debbugs::Collection::Package->new()} - ); +has 'package_collection' => + (is => 'ro', + isa => 'Debbugs::Collection::Package', + builder => '_build_package_collection', + lazy => 1, + ); + +sub _build_package_collection { + my $self = shift; + return Debbugs::Collection::Package->new($self->has_schema?(schema => $self->schema):()); +} -around BUILDARGS => sub { - my $orig = shift; - my $class = shift; +has 'correspondent_collection' => + (is => 'ro', + isa => 'Debbugs::Collection::Correspondent', + builder => '_build_correspondent_collection', + lazy => 1, + ); - my %args; - if (@_==1 and ref($_[0]) eq 'HASH') { - %args = %{$_[0]}; - } else { - %args = @_; - } - $args{members} //= []; - if (exists $args{bugs}) { - push @{$args{members}}, - _member_constructor(bugs => $args{bugs}, - hash_slice(%args,qw(schema constructor_args)), - ); - delete $args{bugs}; +sub _build_correspondent_collection { + my $self = shift; + return Debbugs::Collection::Correspondent->new($self->has_schema?(schema => $self->schema):()); +} + +has 'users' => + (is => 'ro', + isa => 'ArrayRef[Debbugs::User]', + traits => ['Array'], + default => sub {[]}, + handles => {'add_user' => 'push'}, + ); + +sub BUILD { + my $self = shift; + my $args = shift; + if (exists $args->{bugs}) { + $self->add( + $self->_member_constructor(bugs => $args->{bugs} + )); } - return $class->$orig(%args); -}; +} sub _member_constructor { # handle being called $self->_member_constructor; - if ((@_ % 2) == 1) { - shift; - } + my $self = shift; my %args = @_; my @return; - if (exists $args{schema}) { + my $schema; + $schema = $self->schema if $self->has_schema; + + if (defined $schema) { my $statuses = get_bug_statuses(bug => [make_list($args{bugs})], - schema => $args{schema}, + schema => $schema, ); while (my ($bug, $status) = each %{$statuses}) { push @return, - Debbugs::Bug->new(bug=>$bug, - status=>$status, - schema=>$args{schema}, + Debbugs::Bug->new(bug => $bug, + status => $status, + schema => $schema, + package_collection => + $self->package_collection->universe, + bug_collection => + $self->universe, + correspondent_collection => + $self->correspondent_collection->universe, @{$args{constructor_args}//[]}, ); } @@ -78,6 +105,12 @@ sub _member_constructor { for my $bug (make_list($args{bugs})) { push @return, Debbugs::Bug->new(bug => $bug, + package_collection => + $self->package_collection->universe, + bug_collection => + $self->universe, + correspondent_collection => + $self->correspondent_collection->universe, @{$args{constructor_args}//[]}, ); } @@ -89,10 +122,8 @@ around add_by_key => sub { my $orig = shift; my $self = shift; my @members = - _member_constructor(bugs => [@_], - $self->has_schema?(schema => $self->schema):(), - constructor_args => $self->constructor_args, - ); + $self->_member_constructor(bugs => [@_], + ); return $self->$orig(@members); }; @@ -100,6 +131,14 @@ sub member_key { return $_[1]->bug; } +sub load_related_packages_and_versions { + my $self = shift; + my @related_packages_and_versions = + $self->map(sub {$_->related_packages_and_versions}); + $self->package_collection-> + add_packages_and_versions(@related_packages_and_versions); +} + __PACKAGE__->meta->make_immutable; 1;