]> git.donarmstrong.com Git - debbugs.git/blobdiff - Debbugs/Bug/Tag.pm
update OO interface to near-completion
[debbugs.git] / Debbugs / Bug / Tag.pm
index 8ed9246ab5b666516f2c7714ce685f6a3dd4c23d..7b3df32074f8ecf1833094302c86c2265d3e3602 100644 (file)
@@ -25,11 +25,16 @@ use strictures 2;
 use namespace::clean;
 use v5.10; # for state
 
+use Debbugs::User;
+use List::AllUtils qw(uniq);
 use Debbugs::Config qw(:config);
 
 state $valid_tags =
     {map {($_,1)} @{$config{tags}}};
 
+state $short_tags =
+   {%{$config{tags_single_letter}}};
+
 extends 'Debbugs::OOBase';
 
 around BUILDARGS => sub {
@@ -45,20 +50,50 @@ around BUILDARGS => sub {
     }
 };
 
-has tags => (is => 'ro', isa => 'HashRef[Str]',
-            default => sub {{}},
+has tags => (is => 'ro',
+            isa => 'HashRef[Str]',
+            traits => ['Hash'],
+            lazy => 1,
+            reader => '_tags',
+            builder => '_build_tags',
+            handles => {has_tags => 'count'}
            );
-has usertags => (is => 'ro',isa => 'HashRef[Str]',
-                default => sub {{}},
+has usertags => (is => 'ro',
+                isa => 'HashRef[Str]',
+                lazy => 1,
+                reader => '_usertags',
+                builder => '_build_usertags',
                );
 
+sub _build_tags {
+    return {};
+}
+
+sub _build_usertags {
+    return {};
+}
+
+sub is_set {
+    return ($_[0]->tag_is_set($_[1]) or
+        $_[0]->usertag_is_set($_[1]));
+}
+
 sub tag_is_set {
-    return exists $_[0]->tags->{$_[1]} ? 1 : 0;
+    return exists $_[0]->_tags->{$_[1]} ? 1 : 0;
+}
+
+sub usertag_is_set {
+    return exists $_[0]->_usertags->{$_[1]} ? 1 : 0;
 }
 
 sub unset_tag {
     my $self = shift;
-    delete $self->tags->{$_} foreach @_;
+    delete $self->_tags->{$_} foreach @_;
+}
+
+sub unset_usertag {
+    my $self = shift;
+    delete $self->_usertags->{$_} foreach @_;
 }
 
 sub set_tag {
@@ -67,7 +102,7 @@ sub set_tag {
        if (not $self->valid_tag($tag)) {
            confess("Invalid tag $tag");
        }
-       $self->tags->{$tag} = 1;
+       $self->_tags->{$tag} = 1;
     }
     return $self;
 }
@@ -77,7 +112,44 @@ sub valid_tag {
 }
 
 sub as_string {
-    return join(' ',sort keys %{$_[0]->tags})
+    my $self = shift;
+    return $self->join_all(' ');
+}
+
+sub join_all {
+    my $self = shift;
+    my $joiner = shift;
+    $joiner //= ', ';
+    return join($joiner,$self->all_tags);
+}
+
+sub all_tags {
+    return uniq sort $_[0]->tags,$_[0]->usertags;
+}
+
+sub tags {
+    return sort keys %{$_[0]->_tags}
+}
+
+sub short_tags {
+    my $self = shift;
+    my @r;
+    for my $tag ($self->tags) {
+       next unless exists $short_tags->{$tag};
+       push @r,
+          {long => $tag,
+           short => $short_tags->{$tag},
+          };
+    }
+    if (wantarray) {
+       return @r;
+    } else {
+       return [@r];
+    }
+}
+
+sub usertags {
+    return sort keys %{$_[0]->_usertags}
 }
 
 no Mouse;