diff options
Diffstat (limited to 'lib/Tree/Transform/XSLTish/Transformer.pm')
-rw-r--r-- | lib/Tree/Transform/XSLTish/Transformer.pm | 25 |
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; } |