| File: | lib/WWW/Google/Contacts/Group.pm |
| Coverage: | 50.0% |
| line | stmt | bran | cond | sub | pod | time | code |
|---|---|---|---|---|---|---|---|
| 1 | package WWW::Google::Contacts::Group; | ||||||
| 2 | |||||||
| 3 | 11 11 11 | 86 36 90 | use Moose; | ||||
| 4 | 11 11 11 | 130 35 102 | use MooseX::Types::Moose qw( Str ); | ||||
| 5 | 11 | 133 | use WWW::Google::Contacts::Types qw( | ||||
| 6 | Category | ||||||
| 7 | 11 11 | 283 35 | ); | ||||
| 8 | |||||||
| 9 | 11 11 11 | 115 37 169 | use WWW::Google::Contacts::Meta::Attribute::Trait::XmlField; | ||||
| 10 | |||||||
| 11 | 0 | 0 | sub create_url { 'http://www.google.com/m8/feeds/groups/default/full' } | ||||
| 12 | |||||||
| 13 | extends 'WWW::Google::Contacts::Base'; | ||||||
| 14 | |||||||
| 15 | with 'WWW::Google::Contacts::Roles::CRUD'; | ||||||
| 16 | |||||||
| 17 | has id => ( | ||||||
| 18 | isa => Str, | ||||||
| 19 | is => 'ro', | ||||||
| 20 | writer => '_set_id', | ||||||
| 21 | predicate => 'has_id', | ||||||
| 22 | traits => [ 'XmlField' ], | ||||||
| 23 | xml_key => 'id', | ||||||
| 24 | ); | ||||||
| 25 | |||||||
| 26 | has etag => ( | ||||||
| 27 | isa => Str, | ||||||
| 28 | is => 'ro', | ||||||
| 29 | writer => '_set_etag', | ||||||
| 30 | predicate => 'has_etag', | ||||||
| 31 | traits => [ 'XmlField' ], | ||||||
| 32 | xml_key => 'gd:etag', | ||||||
| 33 | include_in_xml => 0, # This is set in HTTP headers | ||||||
| 34 | ); | ||||||
| 35 | |||||||
| 36 | has category => ( | ||||||
| 37 | isa => Category, | ||||||
| 38 | is => 'rw', | ||||||
| 39 | predicate => 'has_category', | ||||||
| 40 | traits => [ 'XmlField' ], | ||||||
| 41 | xml_key => 'category', | ||||||
| 42 | default => sub { undef }, | ||||||
| 43 | coerce => 1, | ||||||
| 44 | ); | ||||||
| 45 | |||||||
| 46 | has title => ( | ||||||
| 47 | isa => Str, | ||||||
| 48 | is => 'rw', | ||||||
| 49 | predicate => 'has_title', | ||||||
| 50 | traits => [ 'XmlField' ], | ||||||
| 51 | xml_key => 'title', | ||||||
| 52 | is_element => 1, | ||||||
| 53 | ); | ||||||
| 54 | |||||||
| 55 | has member => ( | ||||||
| 56 | is => 'ro', | ||||||
| 57 | lazy_build => 1, | ||||||
| 58 | ); | ||||||
| 59 | |||||||
| 60 | has link => ( | ||||||
| 61 | is => 'rw', | ||||||
| 62 | trigger => \&_set_link, | ||||||
| 63 | traits => [ 'XmlField' ], | ||||||
| 64 | xml_key => 'link', | ||||||
| 65 | include_in_xml => 0, | ||||||
| 66 | ); | ||||||
| 67 | |||||||
| 68 | # What to do with different link types | ||||||
| 69 | my $link_map = { | ||||||
| 70 | 'self' | ||||||
| 71 | => sub { my ($self,$link) = @_; $self->_set_id( $link->{ href } ) }, | ||||||
| 72 | }; | ||||||
| 73 | |||||||
| 74 | sub _set_link { | ||||||
| 75 | 0 | my ($self, $links) = @_; | |||||
| 76 | 0 | $links = ref($links) eq 'ARRAY' ? $links : [ $links ]; | |||||
| 77 | 0 0 | foreach my $link ( @{ $links } ) { | |||||
| 78 | 0 | next unless ( defined $link_map->{ $link->{ rel } } ); | |||||
| 79 | 0 | my $code = $link_map->{ $link->{ rel } }; | |||||
| 80 | 0 | $link->{href} =~ s{/full/}{/base/}; | |||||
| 81 | 0 | $self->$code( $link ); | |||||
| 82 | } | ||||||
| 83 | } | ||||||
| 84 | |||||||
| 85 | sub _build_member { | ||||||
| 86 | 0 | my $self = shift; | |||||
| 87 | 0 | my $list = WWW::Google::Contacts::ContactList->new( server => $self->server ); | |||||
| 88 | 0 | return $list->search({ group_membership => $self->id }); | |||||
| 89 | } | ||||||
| 90 | |||||||
| 91 | 11 11 11 | 112 37 91 | no Moose; | ||||
| 92 | __PACKAGE__->meta->make_immutable; | ||||||
| 93 | 1; | ||||||