]> git.donarmstrong.com Git - debbugs.git/blob - Debbugs/Bug/Tag.pm
8ed9246ab5b666516f2c7714ce685f6a3dd4c23d
[debbugs.git] / Debbugs / Bug / Tag.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::Bug::Tag;
8
9 =head1 NAME
10
11 Debbugs::Bug::Tag -- OO interface to bug tags
12
13 =head1 SYNOPSIS
14
15    use Debbugs::Bug::Tag;
16
17 =head1 DESCRIPTION
18
19
20
21 =cut
22
23 use Mouse;
24 use strictures 2;
25 use namespace::clean;
26 use v5.10; # for state
27
28 use Debbugs::Config qw(:config);
29
30 state $valid_tags =
31     {map {($_,1)} @{$config{tags}}};
32
33 extends 'Debbugs::OOBase';
34
35 around BUILDARGS => sub {
36     my $orig = shift;
37     my $class = shift;
38     if (@_ == 1 && !ref $_[0]) {
39         my @tags = split / /,$_[0];
40         my %tags;
41         @tags{@tags} = (1) x @tags;
42         return $class->$orig(tags => \%tags);
43     } else {
44         return $class->$orig(@_);
45     }
46 };
47
48 has tags => (is => 'ro', isa => 'HashRef[Str]',
49              default => sub {{}},
50             );
51 has usertags => (is => 'ro',isa => 'HashRef[Str]',
52                  default => sub {{}},
53                 );
54
55 sub tag_is_set {
56     return exists $_[0]->tags->{$_[1]} ? 1 : 0;
57 }
58
59 sub unset_tag {
60     my $self = shift;
61     delete $self->tags->{$_} foreach @_;
62 }
63
64 sub set_tag {
65     my $self = shift;
66     for my $tag (@_) {
67         if (not $self->valid_tag($tag)) {
68             confess("Invalid tag $tag");
69         }
70         $self->tags->{$tag} = 1;
71     }
72     return $self;
73 }
74
75 sub valid_tag {
76     return exists $valid_tags->{$_[1]}?1:0;
77 }
78
79 sub as_string {
80     return join(' ',sort keys %{$_[0]->tags})
81 }
82
83 no Mouse;
84 1;
85
86
87 __END__
88 # Local Variables:
89 # indent-tabs-mode: nil
90 # cperl-indent-level: 4
91 # End: