1package Net::Google::Calendar::Person;
2
3use strict;
4use XML::Atom::Person;
5use base qw(XML::Atom::Person Net::Google::Calendar::Base);
6
7my %allowed = (
8    attendeeStatus => [qw(accepted declined invited tentative)],
9    attendeeType   => [qw(optional required)],
10    rel            => [qw(attendee organizer performer speaker)],
11
12);
13
14=head1 NAME
15
16Net::Google::Calendar::Person - a thin wrapper round XML::Atom::Person
17
18=head1 METHODS
19
20=head2 new
21
22=cut
23
24sub new {
25    my $class = shift;
26    my %opts  = @_;
27    $opts{Version} = '1.0' unless exists $opts{Version};
28    my $self = $class->SUPER::new(%opts);
29    $self->_initialize();
30    return $self;
31}
32
33
34=head2 name [name]
35
36A simple string value that can be used as a representation of this person.
37
38=cut 
39
40sub name {
41    my $self = shift;
42    return $self->_do('@valueString', @_);
43}
44
45=head2 email [email]
46
47Get or set the email of the person
48
49=cut
50
51sub email {
52    my $self = shift;
53    $self->_do('@email', @_);
54}
55
56=head2 attendee_status [status]
57
58Get or set the status of event attendee.
59
60See:
61
62    http://code.google.com/apis/gdata/elements.html#gdAttendeeStatus
63
64Takes or returns any of the values C<accepted>, C<declined>, C<invited>, C<tentative>.
65
66=cut
67
68sub attendee_status {
69    my $self = shift;
70    $self->_do('attendeeStatus', @_);
71}
72
73=head2 attendee_type [type]
74
75Get or set the type of event attendee.
76
77See:
78
79    http://code.google.com/apis/gdata/elements.html#gdAttendeeType
80
81Takes or returns any of the values C<optional>, C<required>.
82
83=cut
84
85sub attendee_type {
86    my $self = shift;
87    $self->_do('attendeeType', @_);
88}
89
90
91=head2 rel [relationship]
92
93=cut
94
95sub rel {
96    my $self = shift;
97    $self->_do('@rel', @_);
98}
99
100
101sub _do {
102    my $self = shift;
103    my $name = shift;
104    my $attr = ($name =~ s!^@!!);
105    $name =~ s!^gd:!!;
106    my $vals = $allowed{$name};
107    my $gd_ns = ''; # $self->{_gd_ns};
108
109    my $ns =  (defined $vals)? "http://schemas.google.com/g/2005#event." : "";
110    if (@_) {
111        my $new = shift;
112        $new =~ s!^$ns!!;
113        die "$new is not one of the allowed values for $name (".join(",", @$vals).")"
114            unless !defined $vals || grep { $new eq $_ } @$vals;
115        if ($attr) {
116            #print "Setting attr $name to ${ns}${new}\n";
117            $self->set_attr($name, "${ns}${new}");
118        } else {
119            #print "Setting child gd:$name to ${ns}${new}\n";
120            $self->set($gd_ns, "gd:${name}", '', { value => "${ns}${new}" });
121        }
122    }
123    my $val;
124    if ($attr) {
125        $val = $self->get_attr($name);
126    } else {
127        my $tmp = $self->_my_get($gd_ns, "gd:${name}");
128        if (defined $tmp) {
129            $val = $tmp->getAttribute('value');
130        }
131        # else { print "Failed to get gd:${name}\n"; }
132    }
133    $val =~ s!^$ns!! if defined $val;
134    return $val;
135}
1361;
137