### # CSS::SAC::Selector::Sibling - SAC SiblingSelector # Robin Berjon # 24/02/2001 ### package CSS::SAC::Selector::Sibling; use strict; use vars qw($VERSION); $VERSION = $CSS::SAC::VERSION || '0.03'; use base qw(CSS::SAC::Selector); #---------------------------------------------------------------------# # build the fields for an array based object #---------------------------------------------------------------------# use Class::ArrayObjects extend => { class => 'CSS::SAC::Selector', with => [qw( _node_type_ _selector_ _sibling_selector_ )], }; #---------------------------------------------------------------------# ### Constants ######################################################### # # # # sub ELEMENT_NODE () { 1 } sub ATTRIBUTE_NODE () { 2 } sub TEXT_NODE () { 3 } sub CDATA_SECTION_NODE () { 4 } sub ENTITY_REFERENCE_NODE () { 5 } sub ENTITY_NODE () { 6 } sub PROCESSING_INSTRUCTION_NODE () { 7 } sub COMMENT_NODE () { 8 } sub DOCUMENT_NODE () { 9 } sub DOCUMENT_TYPE_NODE () { 10 } sub DOCUMENT_FRAGMENT_NODE () { 11 } sub NOTATION_NODE () { 12 } sub ANY_NODE () { 13 } #---------------------------------------------------------------------# # import() # all import can do is export the constants #---------------------------------------------------------------------# sub import { my $class = shift; my $tag = shift || ''; # check that we have the right tag return unless $tag eq ':constants'; # define some useful vars my $pkg = caller; my @constants = qw( ELEMENT_NODE ATTRIBUTE_NODE TEXT_NODE CDATA_SECTION_NODE ENTITY_REFERENCE_NODE ENTITY_NODE PROCESSING_INSTRUCTION_NODE COMMENT_NODE DOCUMENT_NODE DOCUMENT_TYPE_NODE DOCUMENT_FRAGMENT_NODE NOTATION_NODE ANY_NODE ); # now lets create the constants in the caller's package no strict 'refs'; for my $c (@constants) { my $qname = "${pkg}::$c"; *$qname = \&{$c}; } } #---------------------------------------------------------------------# # # # # ### Constants ######################################################### ### Constructor ####################################################### # # # # #---------------------------------------------------------------------# # CSS::SAC::Selector::Sibling->new($type,$node_type,$sel,$sibling_sel) # creates a new sac SiblingSelector object #---------------------------------------------------------------------# sub new { my $class = ref($_[0])?ref(shift):shift; my $type = shift; my $node_type = shift; my $sel = shift; my $sibling_sel = shift; # create a selector my $ssel = $class->SUPER::new($type); # add our fields $ssel->[_node_type_] = $node_type || ANY_NODE; $ssel->[_selector_] = $sel; $ssel->[_sibling_selector_] = $sibling_sel; return $ssel; } #---------------------------------------------------------------------# # # # # ### Constructor ####################################################### ### Accessors ######################################################### # # # # *CSS::SAC::Selector::Sibling::getNodeType = \&NodeType; *CSS::SAC::Selector::Sibling::getSelector = \&Selector; *CSS::SAC::Selector::Sibling::getSiblingSelector = \&SiblingSelector; #---------------------------------------------------------------------# # my $node_type = $ssel->NodeType() # $ssel->NodeType($node_type) # get/set the node type to which we apply #---------------------------------------------------------------------# sub NodeType { (@_==2) ? $_[0]->[_node_type_] = $_[1] : $_[0]->[_node_type_]; } #---------------------------------------------------------------------# #---------------------------------------------------------------------# # my $sel = $ssel->Selector() # $ssel->Selector($sel) # get/set the selector #---------------------------------------------------------------------# sub Selector { (@_==2) ? $_[0]->[_selector_] = $_[1] : $_[0]->[_selector_]; } #---------------------------------------------------------------------# #---------------------------------------------------------------------# # my $o_ssel = $ssel->SiblingSelector() # $ssel->SiblingSelector($o_ssel) # get/set the sibling selector #---------------------------------------------------------------------# sub SiblingSelector { (@_==2) ? $_[0]->[_sibling_selector_] = $_[1] : $_[0]->[_sibling_selector_]; } #---------------------------------------------------------------------# # # # # ### Accessors ######################################################### 1; =pod =head1 NAME CSS::SAC::Selector::Sibling - SAC SiblingSelector =head1 SYNOPSIS see CSS::SAC::Selector =head1 DESCRIPTION This is a subclass of CSS::SAC::Selector, look there for more documentation. This class adds the methods described below. This subclass also defines the constants for the DOM nodes. It uses the same constants as the DOM, and adds the ANY_NODE constant which matches any node. =head1 CONSTANTS =over =item * ELEMENT_NODE =item * ATTRIBUTE_NODE =item * TEXT_NODE =item * CDATA_SECTION_NODE =item * ENTITY_REFERENCE_NODE =item * ENTITY_NODE =item * PROCESSING_INSTRUCTION_NODE =item * COMMENT_NODE =item * DOCUMENT_NODE =item * DOCUMENT_TYPE_NODE =item * DOCUMENT_FRAGMENT_NODE =item * NOTATION_NODE =item * ANY_NODE =back =head1 METHODS These also exist in spec style, simply prepend them with 'get'. =over =item * CSS::SAC::Selector::Sibling->new($type,$node_type,$sel,$sibling_sel) =item * $ssel->new($type,$node_type,$sel,$sibling_sel) Creates a new sibling selector. =item * $ssel->NodeType([$node_type]) get/set the node type to which we apply =item * $ssel->Selector([$sel]) get/set the selector's sub selector =item * $ssel->SiblingSelector([$sib_sel]) get/set the selector's sibling selector =back =head1 AUTHOR Robin Berjon This module is licensed under the same terms as Perl itself. =cut