sub
new {
my
$class
=
shift
;
my
$action
=
shift
||
die
"You must pass in an action"
;
my
$actor
=
shift
||
die
"You must pass in an actor"
;
my
%opts
=
@_
;
my
$no_dt
=
$opts
{_no_dt};
my
$at
=
delete
$opts
{at} || DateTime->now;
my
$self
=
bless
{
%opts
,
action
=>
$action
,
actor
=>
$actor
},
ref
(
$class
) ||
$class
;
$self
->at(
$at
);
return
$self
;
}
sub
at {
my
$self
=
shift
;
if
(
@_
) {
my
$dt
=
shift
;
if
(
ref
(
$dt
) &&
$dt
->isa(
'DateTime'
)) {
$dt
=
$dt
->epoch
if
$self
->{_no_dt};
}
else
{
$dt
=
$self
->_handle_datetime(
$dt
)
unless
$self
->{_no_dt};
}
$self
->{at} =
$dt
;
}
return
$self
->{at};
}
sub
actor {
my
$self
=
shift
;
$self
->_do(
'actor'
,
@_
) }
sub
action {
my
$self
=
shift
;
$self
->_do(
'action'
,
@_
) }
sub
url {
my
$self
=
shift
;
$self
->_do(
'url'
,
@_
) }
sub
to {
my
$self
=
shift
;
$self
->_do(
'to'
,
@_
) }
sub
regarding {
my
$self
=
shift
;
$self
->_do(
'regarding'
,
@_
) }
sub
source {
my
$self
=
shift
;
$self
->_do(
'source'
,
@_
) }
sub
tags {
my
$self
=
shift
;
my
@args
;
if
(
@_
) {
push
@args
,
join
(
", "
,
@_
);
}
split
/\s*,\s*/,
$self
->_do(
'to'
,
@args
);
}
sub
payload {
my
$self
=
shift
;
$self
->_do(
'payload'
,
@_
) }
sub
parse {
my
$class
=
shift
;
my
$xml
=
shift
;
my
%opts
=
@_
;
my
$parser
=
$class
->parser();
my
$doc
=
$parser
->parse_string(
$xml
);
my
$elem
=
$doc
->documentElement();
return
$class
->_from_element(
$elem
,
%opts
);
}
sub
_from_element {
my
$class
=
shift
;
my
$elem
=
shift
;
my
%opts
=
@_
;
my
$no_dt
= (
ref
(
$class
) &&
$class
->{_no_dt}) ||
$opts
{_no_dt};
foreach
my
$attr
(
$elem
->attributes()) {
my
$name
=
$attr
->name;
$opts
{
$name
} =
$attr
->value;
}
foreach
my
$payload
(
$elem
->getChildrenByTagName(
'payload'
)) {
$opts
{payload} = Net::Gnip::Activity::Payload->_from_element(
$payload
,
_no_dt
=>
$no_dt
);
last
;
}
$opts
{at} =
$class
->_handle_datetime(
$opts
{at});
return
$class
->new(
delete
$opts
{action},
delete
$opts
{actor},
%opts
,
_no_dt
=>
$no_dt
);
}
sub
as_xml {
my
$self
=
shift
;
my
$as_element
=
shift
;
my
$element
= XML::LibXML::Element->new(
'activity'
);
my
$payload
=
delete
$self
->{payload};
foreach
my
$key
(
keys
%$self
) {
next
if
'_'
eq
substr
(
$key
, 0, 1);
my
$value
=
$self
->{
$key
};
if
(
'at'
eq
$key
) {
$value
= DateTime->from_epoch(
epoch
=>
$value
)
unless
ref
(
$value
);
$value
=
$self
->_handle_datetime(
$value
);
}
$element
->setAttribute(
$key
,
$value
);
}
$element
->addChild(
$payload
->as_xml(1))
if
defined
$payload
;
return
(
$as_element
) ?
$element
:
$element
->toString(1);
}
sub
_handle_datetime {
my
$self
=
shift
;
my
$dt
=
shift
;
if
(
ref
$dt
&&
$dt
->isa(
'DateTime'
)) {
return
$dt
->strftime(
"%FT%H:%M:%SZ"
)
}
else
{
return
DateTime::Format::ISO8601->parse_datetime(
$dt
)
}
}
1;