From 729bbc7e7d1ae6b4f6f6dc222469b84bb8a94c0f Mon Sep 17 00:00:00 2001 From: Gianni Ceccarelli Date: Thu, 26 Mar 2009 15:38:48 +0100 Subject: non-working first attempt --- lib/Tree/Template/Declare.pm | 46 +++++++++++++++++++++++++++++++++++++------- t/01-basic.t | 2 +- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/lib/Tree/Template/Declare.pm b/lib/Tree/Template/Declare.pm index 8c33b52..4e060d4 100644 --- a/lib/Tree/Template/Declare.pm +++ b/lib/Tree/Template/Declare.pm @@ -3,7 +3,8 @@ use strict; use warnings; use Sub::Exporter; use Devel::Caller 'caller_args'; -use Tree::DAG_Node::XPath; +use Carp; +use Data::Dumper; our $VERSION='0.1'; @@ -11,9 +12,41 @@ Sub::Exporter::setup_exporter({ exports => [qw(tree node name attribs)], groups => { default => [qw(tree node name attribs)], - } + builder => \&_set_builder_for_package, + }, }); +{ +my %builder_for; +sub _set_builder_for_package { + my ($class,$name,$args)=@_; + + my $builder_pkg=$args->{import_args}->[0]->[0]; + + if (!ref($builder_pkg)) { + if ($builder_pkg=~m{\A \+(\w+) \z}smx) { + $builder_pkg="Tree::Template::Declare::$1"; + } + eval "require $builder_pkg"; + croak "Can't load $builder_pkg: $@" if $@; + } + $builder_for{$args->{into}}=$builder_pkg; + + return 1; +} + +sub builder_for { + my ($pkg)=@_; + + if (exists $builder_for{$pkg}) { + return $builder_for{$pkg}; + } + else { + return $pkg; + } +} +} + our $current_node; sub tree(&) { @@ -24,7 +57,7 @@ sub tree(&) { } sub node(&) { - my $node=Tree::DAG_Node::XPath->new(); + my $node=builder_for(caller)->new_node(); #warn "new node\n"; { local $current_node=$node; @@ -32,22 +65,21 @@ sub node(&) { } if ($current_node) { #warn "adding to parent (@{[ $current_node->name ]})\n"; - $current_node->add_daughter($node); + builder_for(caller)->add_child_node($current_node,$node); } return $node; } sub name($) { #warn "setting name ($_[0])\n"; - $current_node->name($_[0]); + builder_for(caller)->set_node_name($current_node,$_[0]); } sub attribs { my %attrs=@_; #warn "setting attributes\n"; - $current_node->attributes(\%attrs); + builder_for(caller)->set_node_attributes($current_node,\%attrs); return; } - 1; diff --git a/t/01-basic.t b/t/01-basic.t index a063a2f..006fa6a 100644 --- a/t/01-basic.t +++ b/t/01-basic.t @@ -2,7 +2,7 @@ use Test::Most 'no_plan','die'; use strict; use warnings; -use Tree::Template::Declare; +use Tree::Template::Declare '+DAG_Node'; use Data::Dumper; my $tree=tree { -- cgit v1.2.3