diff options
author | Gianni Ceccarelli <dakkar@dechirico.(none)> | 2009-03-18 16:38:54 +0100 |
---|---|---|
committer | Gianni Ceccarelli <dakkar@dechirico.(none)> | 2009-03-18 16:38:54 +0100 |
commit | 521c79b58c41d08ca6d4db39b877d069867fb62d (patch) | |
tree | 0300019b0a13a81159381b1319f9698a409e4eb7 /lib/Tree | |
parent | inheritance (diff) | |
download | Tree-Transform-XSLTish-521c79b58c41d08ca6d4db39b877d069867fb62d.tar.gz Tree-Transform-XSLTish-521c79b58c41d08ca6d4db39b877d069867fb62d.tar.bz2 Tree-Transform-XSLTish-521c79b58c41d08ca6d4db39b877d069867fb62d.zip |
call by name
Diffstat (limited to 'lib/Tree')
-rw-r--r-- | lib/Tree/Transform.pm | 12 | ||||
-rw-r--r-- | lib/Tree/Transform/Transformer.pm | 51 |
2 files changed, 60 insertions, 3 deletions
diff --git a/lib/Tree/Transform.pm b/lib/Tree/Transform.pm index febd8e3..bf3d18b 100644 --- a/lib/Tree/Transform.pm +++ b/lib/Tree/Transform.pm @@ -5,6 +5,7 @@ use Sub::Exporter; use Params::Validate ':all'; use Tree::Transform::Utils; use Tree::Transform::Transformer; +use Carp::Clan qw(^Tree::Transform); our $VERSION='0.1'; @@ -36,12 +37,19 @@ sub tree_rule { }); # TODO at least one of 'name' and 'match' must be specified + # TODO default priority mased on match my $store=Tree::Transform::Utils::_rules_store(scalar caller); - push @{$store->{by_match}},\%args; + if ($args{match}) { + push @{$store->{by_match}},\%args; + } if ($args{name}) { - push @{$store->{by_name}{$args{name}}},\%args; + if (exists $store->{by_name}{$args{name}}) { + carp "Duplicate rule named $args{name}, ignoring"; + return; + } + $store->{by_name}{$args{name}}=\%args; } return; diff --git a/lib/Tree/Transform/Transformer.pm b/lib/Tree/Transform/Transformer.pm index 685e99e..c188b29 100644 --- a/lib/Tree/Transform/Transformer.pm +++ b/lib/Tree/Transform/Transformer.pm @@ -64,6 +64,23 @@ sub apply_rules { return @ret; } +sub call_rule { + my ($self,$name)=@_; + + unless ($name) { + carp 'call_rule called without a rule name!'; + return; + } + + unless ($self->has_context) { + carp 'call_rule called without context!'; + return; + } + + my $rule=$self->find_rule_by_name($name); + return $rule->{action}->($self); +} + sub find_rule { my ($self,$context)=@_; @@ -76,6 +93,18 @@ sub find_rule { return $ret; } +sub find_rule_by_name { + my ($self,$name,$context)=@_; + + my $ret=$self->find_rule_by_name_in_package($self->rules_package,$name,$context); + + if (!$ret) { + croak "No rule named $name"; + } + + return $ret; +} + sub find_rule_in_package { my ($self,$package,$context)=@_; @@ -99,7 +128,27 @@ sub find_rule_in_package { my @inherited=Tree::Transform::Utils::_get_isa($package); for my $inh_pack (@inherited) { - my $ret=$self->find_rule_in_package($inh_pack); + my $ret=$self->find_rule_in_package($inh_pack,$context); + return $ret if $ret; + } +} + +sub find_rule_by_name_in_package { + my ($self,$package,$name,$context)=@_; + + $context||=$self->context; + + my $store=Tree::Transform::Utils::_rules_store($package); + + my $rules=$store->{by_name}; + + if (exists $rules->{$name}) { + return $rules->{$name}; + } + + my @inherited=Tree::Transform::Utils::_get_isa($package); + for my $inh_pack (@inherited) { + my $ret=$self->find_rule_by_name_in_package($inh_pack,$name,$context); return $ret if $ret; } } |