WebService::GData::Node - Abstract class representing an xml node/tag
#your package should use the abstract Node package. #it will automaticly inherit from it. #Author.pm files: use WebService::GData::Node::Author; use WebService::GData::Node; 1; #Name.pm use WebService::GData::Node::Name; use WebService::GData::Node; 1; #Category.pm package WebService::GData::Node::Category; use WebService::GData::Node; set_xml_meta( attributes=>['scheme','yt:term','label'],#default to [] is_parent => 0, #default 1 namespace_prefix => 'k', #default to '' tag_name => 'category' # default to the package file name with the first letter in lower case ); 1; #user code: use WebService::GData::Node::Name(); #avoid to inherit from it by not importing use WebService::GData::Node::Author(); use WebService::GData::Node::Category(); my $author = new WebService::GData::Node::Author(); my $name = new WebService::GData::Node::Name(text=>'john doe'); my $category = new WebService::GData::Node::Category(scheme=>'author','yt:term'=>'Author'); #or coming from a json feed: my $category = new WebService::GData::Node::Category({scheme=>'author','yt$term'=>'Author'}); $author->child($name)->child($category); $name->text;#john doe $category->scheme;#author; $category->scheme('compositor'); print $author;#<author><name>john doe</name><k:category scheme="compositor" yt:term="Author"/></author>
inherits from WebService::GData
This package is an abstract class representing the information required to serialize a node object into xml. It regroups the mechanism to store the meta data about a node and from there built the proper xml output. It is not an all purpose class for building complex xml data. It does not parse xml either.
You should subclass and set the meta information via the set_xml_data function that will be installed in your package (see below for further explanation). You can instantiate this class if you want... it will not throw any error but you won't be able to do much.
set_xml_data
A node is only the representation of one xml tag. Feed and Feed subclasses are the representation of an entire JSON response or offers a subset.
See also WebService::GData::Node::AbstractEntity.
Create an instance but you won't be able to do much as no meaningful meta data has been set. You should inherit from this class.
Parameters
args:Hash
args:HashRef
Returns
Example:
use WebService::GData::Node; my $node = new WebService::GData::Node(text=>'hi'); $node->text();#hi; print $node;"<>hi<>"; #this is an abstract node!
This class overwrite the default __to_string method to call serialize and output the xml data. Therefore if you use a Node object in a string context, you will get back its xml representation.
serialize
The attributes setter/getters and the text method are generated on the fly.
* you can use either hyphen base notation or camelCase notation.
* Attributes containing namespaces can be accessed by replacing ':' with '_'. yt:format attribute can be set/get via the yt_format method. You should use the qualified attribute when setting it via the constructor. Therefore, new Node(yt_format=>1) will not work but new Node('yt:format'=>1) and new Node({'yt$format'=>1}) will work.
use WebService::GData::Node::FeedLink; my $feedlink = new WebService::GData::Node::FeedLink($link); $feedlink->countHint; #or $feedlink->count_hint;
Set an other node child of the instance. It returns the instance so you can chain the calls. You can not set the instance as a child of itself. The child method checks against the memory slot of the object and will return the instance without setting the object if it appears to be the same.
node:WebService::GData::Node
instance:WebService::GData::Node
my $author = new WebService::GData::Node::Author(); my $name = new WebService::GData::Node::Name(text=>'john doe'); my $category = new WebService::GData::Node::Category(scheme=>'author',term=>'Author'); $author->child($name)->child($category); #the same object can not be a child of itself. which makes sense. #it just silently returns the instance. $author->child($author);
This method will put a new instance instead of an existing child.
oldchild::WebService::GData::Node|WebService::GData::Collection
newchild::WebService::GData::Node|WebService::GData::Collection
my $author = new WebService::GData::Node::Author(); my $name = new WebService::GData::Node::Name(text=>'john doe'); my $category = new WebService::GData::Node::Category(scheme=>'author',term=>'Author'); $author->child($name)->child($category); my $newname = new WebService::GData::Node::Name(text=>'billy doe'); $author->swap($name,$newname);
This method will create the xml output of the instance and make recursive call to the serialize method of the children.
none
xml_data:Scalar
my $author = new WebService::GData::Node::Author(); my $name = new WebService::GData::Node::Name(text=>'john doe'); my $category = new WebService::GData::Node::Category(scheme=>'author',term=>'Author'); $author->child($name)->child($category); $author->serialize;#<author><name>john doe</name><k:category scheme="author" yt:term="Author"/></author>
The following methods are installed by default in the package subclassing this class. You should set their value via the set_xml_data method (see below).
The package will push itself in the inheritance chain automaticly when you use it so it is not necessary to explicitly declare the inheritance. As a consequence though, every sub classes that are used will also automaticly set themself in the inheritance chain of the user. In order to avoid this behavior you should write:
use
use WebService::GData::Node();
The following function will be accessible in the sub class.
Set the meta data of the node.
args::Hash
Returns install the methods in the package.
#Category.pm package WebService::GData::Node::Category; use WebService::GData::Node; set_xml_meta( attributes=>['scheme','yt:term','label'],#default to [] is_parent => 0, #default 1 namespace_prefix => 'k', #default to '' tag_name => 'category' # default to the package file name with the first letter in lower case ); 1; use WebService::GData::Node::Category(); my $category = new WebService::GData::Node::Category('yt:term'=>'term'); $category->yt_term('youtube term'); "$category";#<k:category yt:term="youtube term"/>
Many core nodes have already be implemented. You can look at their source directly to see their meta information. Although you may use this class and subclasses to implement other tags, most of the time they will be wrapped in the Feed packages and the end user shall not interact directly with them.
For reference, below is a list of all the tags implemented so far with their meta information (when it overwrites the default settings).
APP #app: namespace - Control - Draft - Edited Author Category #attributes=>scheme term label Content #attributes=>src type GD #gd: namespace - Comments - FeedLink #attributes=>rel href countHint,is_parent=>0 - Rating #attributes=>min max numRaters average value,is_parent=>0 GeoRSS #georss: namespace - Where GML #gml: namespace - Point #tag_name=>'Point' - Pos Link #attributes=>rel type href Media #media: namespace - Category #attributes=>scheme label - Content #attributes=>url type medium isDefault expression duration yt:format,is_parent=>0 - Credit #attributes=>role yt:type scheme - Description #attributes=>type - Group - Keywords - Player #attributes=>url - Rating #attributes=>scheme country - Restriction #attributes=>type relationship - Thumbnail #attributes=>url height width time, is_parent=>0 - Title #attributes=>type Name Summary Title Uri
As the package push itself into your package when you use it, you must be aware when to change this behavior.
All the methods installed in the package could conflict with a node name or its attributes.
If you do me the favor to _use_ this module and find a bug, please email me i will try to do my best to fix it (patches welcome)!
shiriru <shirirulestheworld[arobas]gmail.com>
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
6 POD Errors
The following errors were encountered while parsing the POD:
You forgot a '=back' before '=head2'
You can't have =items (as at line 261) unless the first thing after the =over is an =item
=back without =over
Unknown directive: =head
To install WebService::GData, copy and paste the appropriate command in to your terminal.
cpanm
cpanm WebService::GData
CPAN shell
perl -MCPAN -e shell install WebService::GData
For more information on module installation, please visit the detailed CPAN module installation guide.