summaryrefslogtreecommitdiff
path: root/lib/Data/MultiValued/AttributeTrait/Tags.pm
blob: 7803c24eb528167284f8a52ed55e774787f20b08 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package Data::MultiValued::AttributeTrait::Tags; 
use Moose::Role;
use namespace::autoclean;
use Data::MultiValued::Tags;
with 'Data::MultiValued::AttributeTrait';
 
# ABSTRACT: attribute traits for attributes holding tagged values 
 
=head1 SYNOPSIS
 
  package My::Class;
  use Moose;
  use Data::MultiValued::AttributeTrait::Tags;
 
  has stuff => (
    is => 'rw',
    isa => 'Int',
    traits => ['MultiValued::Tags'],
    predicate => 'has_stuff',
    multi_accessor => 'stuff_tagged',
    multi_predicate => 'has_stuff_tagged',
  );
 
=head1 DESCRIPTION
 
This role consumes L<Data::MultiValued::AttributeTrait> and
specialises it to use L<Data::MultiValued::Tags> as multi-value
storage:
 
=head2 C<multivalue_storage_class>
 
Returns C<'Data::MultiValued::Tags'>.
 
=head2 C<opts_to_pass_set>
 
Returns C<('tag')>.
 
=head2 C<opts_to_pass_get>
 
Returns C<('tag')>.
 
=head2 C<all_tags>
 
  my @tags = $obj->meta->get_attribute('my_attr')->all_tags($obj);
 
Returns a list of all values for which C<<
$obj->has_my_attr_multi({tag=>$tag}) >> would return true.
 
=cut
 
sub multivalue_storage_class 'Data::MultiValued::Tags' };
sub opts_to_pass_set qw(tag) }
sub opts_to_pass_get qw(tag) }
 
sub all_tags {
    my ($self,$instance) = @_;
 
    my $storage = $self->get_full_storage($instance);
    return () unless $storage;
 
    my @tags = $storage->_storage->all_tags;
    if ($storage->_storage->_has_default_tag) {
        push @tags,undef;
    }
    return @tags;
}
 
package Moose::Meta::Attribute::Custom::Trait::MultiValued::Tags;{ 
sub register_implementation 'Data::MultiValued::AttributeTrait::Tags' }
}
 
1;