summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGianni Ceccarelli <dakkar@dechirico.(none)>2009-03-19 12:18:17 +0100
committerGianni Ceccarelli <dakkar@dechirico.(none)>2009-03-19 12:18:17 +0100
commit1af28933a9cff0015d271306f510e616583431c9 (patch)
treec229f914fe93ced4d5d281ff68c8fcc40dccd72c
parentcall by name (diff)
downloadTree-Transform-XSLTish-1af28933a9cff0015d271306f510e616583431c9.tar.gz
Tree-Transform-XSLTish-1af28933a9cff0015d271306f510e616583431c9.tar.bz2
Tree-Transform-XSLTish-1af28933a9cff0015d271306f510e616583431c9.zip
using Class::MOP instead of symbol table hackery
-rw-r--r--lib/Tree/Transform/Transformer.pm32
-rw-r--r--lib/Tree/Transform/Utils.pm20
2 files changed, 20 insertions, 32 deletions
diff --git a/lib/Tree/Transform/Transformer.pm b/lib/Tree/Transform/Transformer.pm
index c188b29..a773f29 100644
--- a/lib/Tree/Transform/Transformer.pm
+++ b/lib/Tree/Transform/Transformer.pm
@@ -84,25 +84,25 @@ sub call_rule {
sub find_rule {
my ($self,$context)=@_;
- my $ret=$self->find_rule_in_package($self->rules_package,$context);
-
- if (!$ret) {
- croak "No valid rule";
+ for my $pack (Tree::Transform::Utils::_get_inheritance
+ ($self->rules_package)) {
+ my $ret=$self->find_rule_in_package($pack,$context);
+ return $ret if $ret;
}
- return $ret;
+ croak "No valid rule";
}
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";
+ for my $pack (Tree::Transform::Utils::_get_inheritance
+ ($self->rules_package)) {
+ my $ret=$self->find_rule_by_name_in_package($pack,$name,$context);
+ return $ret if $ret;
}
- return $ret;
+ croak "No rule named $name";
}
sub find_rule_in_package {
@@ -125,12 +125,6 @@ sub find_rule_in_package {
elsif (@candidates >= 1) {
return $candidates[0];
}
-
- my @inherited=Tree::Transform::Utils::_get_isa($package);
- for my $inh_pack (@inherited) {
- my $ret=$self->find_rule_in_package($inh_pack,$context);
- return $ret if $ret;
- }
}
sub find_rule_by_name_in_package {
@@ -145,12 +139,6 @@ sub find_rule_by_name_in_package {
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;
- }
}
sub rule_matches {
diff --git a/lib/Tree/Transform/Utils.pm b/lib/Tree/Transform/Utils.pm
index f2b2d6b..cdc58f7 100644
--- a/lib/Tree/Transform/Utils.pm
+++ b/lib/Tree/Transform/Utils.pm
@@ -1,21 +1,21 @@
package Tree::Transform::Utils;
use strict;
use warnings;
+use Class::MOP;
+
+my $RULES_NAME='%_tree_transform_rules';
sub _rules_store {
- no strict 'refs';
- if (!defined *{$_[0].'::_tree_transform_rules'}{HASH}) {
- *{$_[0].'::_tree_transform_rules'}={};
+ my $pack=Class::MOP::Class->initialize($_[0]);
+
+ if (! $pack->has_package_symbol($RULES_NAME) ) {
+ $pack->add_package_symbol($RULES_NAME,{});
}
- return *{$_[0].'::_tree_transform_rules'}{HASH};
+ return $pack->get_package_symbol($RULES_NAME);
}
-sub _get_isa {
- no strict 'refs';
- if (!defined *{$_[0].'::ISA'}{ARRAY}) {
- return ();
- }
- return @{*{$_[0].'::ISA'}{ARRAY}};
+sub _get_inheritance {
+ return Class::MOP::Class->initialize($_[0])->class_precedence_list;
}
1;