use strict; use warnings; package XML::Rabbit::RootNode; { $XML::Rabbit::RootNode::VERSION = '0.3.0'; } use Moose::Role; with 'XML::Rabbit::Role::Document'; # ABSTRACT: Root node base class # Preload XPath attribute traits use XML::Rabbit::Trait::XPathValue; use XML::Rabbit::Trait::XPathValueList; use XML::Rabbit::Trait::XPathValueMap; use XML::Rabbit::Trait::XPathObject; use XML::Rabbit::Trait::XPathObjectList; use XML::Rabbit::Trait::XPathObjectMap; with 'XML::Rabbit::Role::Node' => { 'node' => { lazy => 1, builder => '_build__node' }, 'xpc' => { lazy => 1, builder => '_build__xpc' }, }; sub _build__node { return shift->_document->documentElement(); } sub _build__xpc { my ($self) = @_; # XML::LibXML loads this class, see XML::Rabbit::Role::Document my $xpc = XML::LibXML::XPathContext->new( $self->_document ); # Make sure namespace_map is inherited from XML::Rabbit::Role::Node confess("Required role 'XML::Rabbit::Role::Node' not composed") unless $self->does('XML::Rabbit::Role::Node'); # Register all prefixes specified in namespace_map for use in xpath queries foreach my $prefix ( keys %{ $self->namespace_map } ) { $xpc->registerNs($prefix, $self->namespace_map->{$prefix}); } return $xpc; } no Moose::Role; 1; __END__ =pod =encoding utf-8 =head1 NAME XML::Rabbit::RootNode - Root node base class =head1 VERSION version 0.3.0 =head1 SYNOPSIS package MyXMLSyntax; use Moose; with 'XML::Rabbit::RootNode'; has title => ( isa => 'Str', traits => [qw(XPathValue)], xpath_query => '/root/title', ); no Moose; __PACKAGE__->meta->make_immutable(); 1; =head1 DESCRIPTION This module provides the base node attribute used to hold the root of the XML document. See L for a more complete example. =head1 ATTRIBUTES =head2 node An instance of a L class representing the root node of an XML document. Read Only. It is lazily loaded from the C attribute, which is inherited from L. =head2 xpc An instance of a L class initialized with the C attribute. Read Only. If a subclass has an attribute named C which is a HashRef it is used to initialize namespaces using the C method. This is required on XML files that use namespaces, like XHTML. =head1 AUTHOR Robin Smidsrød =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2013 by Robin Smidsrød. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut