diff options
author | Gianni Ceccarelli <dakkar@dechirico.(none)> | 2009-03-18 16:23:41 +0100 |
---|---|---|
committer | Gianni Ceccarelli <dakkar@dechirico.(none)> | 2009-03-18 16:23:41 +0100 |
commit | 6ddc252f223ef602992ccdc647eab293c7ca1112 (patch) | |
tree | 3ff53f4faeba28a6f78e6c51ab37032fe5f2f8e2 /lib/Tree/Transform | |
parent | default rules (diff) | |
download | Tree-Transform-XSLTish-6ddc252f223ef602992ccdc647eab293c7ca1112.tar.gz Tree-Transform-XSLTish-6ddc252f223ef602992ccdc647eab293c7ca1112.tar.bz2 Tree-Transform-XSLTish-6ddc252f223ef602992ccdc647eab293c7ca1112.zip |
inheritance
Diffstat (limited to 'lib/Tree/Transform')
-rw-r--r-- | lib/Tree/Transform/Transformer.pm | 28 | ||||
-rw-r--r-- | lib/Tree/Transform/Utils.pm | 8 |
2 files changed, 29 insertions, 7 deletions
diff --git a/lib/Tree/Transform/Transformer.pm b/lib/Tree/Transform/Transformer.pm index 24e5428..685e99e 100644 --- a/lib/Tree/Transform/Transformer.pm +++ b/lib/Tree/Transform/Transformer.pm @@ -56,7 +56,7 @@ sub apply_rules { #warn "# applying rules to @{[ $node ]}"; my $rule=$self->find_rule(); - push @ret,$rule->($self); + push @ret,$rule->{action}->($self); } $self->leave; @@ -67,11 +67,21 @@ sub apply_rules { sub find_rule { my ($self,$context)=@_; - $context||=$self->context; + my $ret=$self->find_rule_in_package($self->rules_package,$context); + + if (!$ret) { + croak "No valid rule"; + } + + return $ret; +} + +sub find_rule_in_package { + my ($self,$package,$context)=@_; - my $store=Tree::Transform::Utils::_rules_store($self->rules_package); + $context||=$self->context; - # TODO inheritance + my $store=Tree::Transform::Utils::_rules_store($package); my $rules=$store->{by_match}; @@ -83,11 +93,15 @@ sub find_rule { $candidates[1]->{priority}) { croak "Ambiguous rule application"; } - elsif (@candidates == 0) { - croak "No valid rule"; + elsif (@candidates >= 1) { + return $candidates[0]; } - return $candidates[0]->{action}; + my @inherited=Tree::Transform::Utils::_get_isa($package); + for my $inh_pack (@inherited) { + my $ret=$self->find_rule_in_package($inh_pack); + return $ret if $ret; + } } sub rule_matches { diff --git a/lib/Tree/Transform/Utils.pm b/lib/Tree/Transform/Utils.pm index d8786dd..f2b2d6b 100644 --- a/lib/Tree/Transform/Utils.pm +++ b/lib/Tree/Transform/Utils.pm @@ -10,4 +10,12 @@ sub _rules_store { return *{$_[0].'::_tree_transform_rules'}{HASH}; } +sub _get_isa { + no strict 'refs'; + if (!defined *{$_[0].'::ISA'}{ARRAY}) { + return (); + } + return @{*{$_[0].'::ISA'}{ARRAY}}; +} + 1; |