summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGianni Ceccarelli <dakkar@dechirico.(none)>2009-03-25 16:48:14 +0100
committerGianni Ceccarelli <dakkar@dechirico.(none)>2009-03-25 16:48:14 +0100
commit1a2822c8b182b19d70fd116a3a0bcf038caa6aef (patch)
tree82ec103c12ab95c939980974a33be10279531649 /lib
parentdoc tweak (diff)
downloadTree-Transform-XSLTish-1a2822c8b182b19d70fd116a3a0bcf038caa6aef.tar.gz
Tree-Transform-XSLTish-1a2822c8b182b19d70fd116a3a0bcf038caa6aef.tar.bz2
Tree-Transform-XSLTish-1a2822c8b182b19d70fd116a3a0bcf038caa6aef.zip
now you can specify the engine in the transfor class
Diffstat (limited to 'lib')
-rw-r--r--lib/Tree/Transform/XSLTish.pm29
-rw-r--r--lib/Tree/Transform/XSLTish/Transformer.pm15
-rw-r--r--lib/Tree/Transform/XSLTish/Utils.pm12
3 files changed, 51 insertions, 5 deletions
diff --git a/lib/Tree/Transform/XSLTish.pm b/lib/Tree/Transform/XSLTish.pm
index 3889b3a..97a6f1f 100644
--- a/lib/Tree/Transform/XSLTish.pm
+++ b/lib/Tree/Transform/XSLTish.pm
@@ -9,12 +9,15 @@ use Carp::Clan qw(^Tree::Transform::XSLTish);
our $VERSION='0.1';
+my @DEFAULT_EXPORTS=('tree_rule',
+ 'default_rules',
+ 'new_transformer' => {-as => 'new'});
+
Sub::Exporter::setup_exporter({
- exports => [qw(tree_rule default_rules new_transformer)],
+ exports => [qw(tree_rule default_rules new_transformer engine_class engine_factory)],
groups => {
- default => [ 'tree_rule',
- 'default_rules',
- 'new_transformer' => {-as => 'new'} ],
+ default => \@DEFAULT_EXPORTS,
+ engine => [@DEFAULT_EXPORTS, qw(engine_class engine_factory)],
}
});
@@ -55,6 +58,24 @@ sub tree_rule {
return;
}
+sub engine_class {
+ my ($classname)=@_;
+
+ my $factory=Tree::Transform::XSLTish::Utils::_engine_factory(scalar caller);
+ $$factory=sub{$classname->new()};
+
+ return;
+}
+
+sub engine_factory {
+ my ($new_factory)=@_;
+
+ my $factory=Tree::Transform::XSLTish::Utils::_engine_factory(scalar caller);
+ $$factory=$new_factory;
+
+ return;
+}
+
sub _transformer_class { 'Tree::Transform::XSLTish::Transformer' };
sub new_transformer {
diff --git a/lib/Tree/Transform/XSLTish/Transformer.pm b/lib/Tree/Transform/XSLTish/Transformer.pm
index c6102a7..fd61ea6 100644
--- a/lib/Tree/Transform/XSLTish/Transformer.pm
+++ b/lib/Tree/Transform/XSLTish/Transformer.pm
@@ -36,9 +36,22 @@ has 'context_stack' => (
has 'engine' => (
is => 'ro',
isa => 'Tree::Transform::XSLTish::Engine',
- default => sub { Tree::XPathEngine->new() },
+ lazy => 1,
+ builder => '_build_engine',
);
+sub _build_engine {
+ my ($self)=@_;
+
+ if ($self->rules_package) {
+ my $factory=Tree::Transform::XSLTish::Utils::_engine_factory($self->rules_package);
+ if ($$factory) {
+ return $$factory->();
+ }
+ }
+ return Tree::XPathEngine->new();
+}
+
sub it { $_[0]->context->current_node }
sub transform {
diff --git a/lib/Tree/Transform/XSLTish/Utils.pm b/lib/Tree/Transform/XSLTish/Utils.pm
index 11a25cb..bed1167 100644
--- a/lib/Tree/Transform/XSLTish/Utils.pm
+++ b/lib/Tree/Transform/XSLTish/Utils.pm
@@ -14,6 +14,18 @@ sub _rules_store {
return $pack->get_package_symbol($RULES_NAME);
}
+my $ENGINE_FACTORY_NAME='$_tree_transform_engine_factory';
+
+sub _engine_factory {
+ my $pack=Class::MOP::Class->initialize($_[0]);
+
+ if (! $pack->has_package_symbol($ENGINE_FACTORY_NAME) ) {
+ $pack->add_package_symbol($ENGINE_FACTORY_NAME,undef);
+ }
+ return $pack->get_package_symbol($ENGINE_FACTORY_NAME);
+}
+
+
sub _get_inheritance {
return Class::MOP::Class->initialize($_[0])->class_precedence_list;
}