summaryrefslogtreecommitdiff
path: root/lib/Tree/Transform/XSLTish/Transformer.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Tree/Transform/XSLTish/Transformer.pm')
-rw-r--r--lib/Tree/Transform/XSLTish/Transformer.pm25
1 files changed, 17 insertions, 8 deletions
diff --git a/lib/Tree/Transform/XSLTish/Transformer.pm b/lib/Tree/Transform/XSLTish/Transformer.pm
index 2f8fc52..8b06422 100644
--- a/lib/Tree/Transform/XSLTish/Transformer.pm
+++ b/lib/Tree/Transform/XSLTish/Transformer.pm
@@ -1,12 +1,23 @@
package Tree::Transform::XSLTish::Transformer;
use Moose;
use MooseX::AttributeHelpers;
+use Moose::Util::TypeConstraints;
use Params::Validate ':all';
use Tree::Transform::XSLTish::Utils;
use Tree::Transform::XSLTish::Context;
use Tree::XPathEngine;
use Carp::Clan qw(^Tree::Transform::XSLTish);
+subtype 'Tree::Transform::XSLTish::Engine'
+ => as 'Object'
+ => where {
+ my $object=$_;
+ for my $meth (qw(findnodes matches exists)) {
+ return unless $object->can($meth);
+ }
+ return 1;
+ };
+
has 'rules_package' => (is => 'ro', isa => 'ClassName');
has 'context_stack' => (
@@ -24,7 +35,7 @@ has 'context_stack' => (
has 'engine' => (
is => 'ro',
- isa => 'Tree::XPathEngine',
+ isa => 'Tree::Transform::XSLTish::Engine',
default => sub { Tree::XPathEngine->new() },
);
@@ -33,7 +44,7 @@ sub it { $_[0]->context->current_node }
sub transform {
my ($self,$tree)=@_;
- return $self->apply_rules($tree->xpath_get_root_node);
+ return $self->apply_rules($self->engine->findnodes('/',$tree));
}
sub apply_rules {
@@ -44,7 +55,7 @@ sub apply_rules {
carp 'apply_rules called without nodes nor context!';
return;
}
- @nodes=$self->it->xpath_get_child_nodes();
+ @nodes=$self->engine->findnodes('*',$self->it);
};
my $guard=Tree::Transform::XSLTish::ContextGuard->new
@@ -153,17 +164,15 @@ sub rule_matches {
# XXX check the semantic
my $base_node=$node;
- while (1) {
+ while ($base_node) {
#warn "# Testing <$path> against @{[ $node ]} based on @{[ $base_node ]}";
if ($self->engine->matches($node,$path,$base_node)) {
return 1;
}
- if ($base_node->xpath_is_document_node) {
- return;
- }
- $base_node=$base_node->xpath_get_parent_node;
+
+ ($base_node)=$self->engine->findnodes('..',$base_node);
}
return;
}