summaryrefslogtreecommitdiff
path: root/lib/Tree/Transform.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Tree/Transform.pm')
-rw-r--r--lib/Tree/Transform.pm44
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/Tree/Transform.pm b/lib/Tree/Transform.pm
index 99cc07f..7b9af2c 100644
--- a/lib/Tree/Transform.pm
+++ b/lib/Tree/Transform.pm
@@ -1,8 +1,52 @@
package Tree::Transform;
use Moose;
+use Sub::Exporter;
+use Params::Validate ':all';
our $VERSION='0.1';
+Sub::Exporter::setup_exporter({
+ exports => [qw(tree_rule new_transformer)],
+ groups => {
+ default => [ 'tree_rule',
+ 'new_transformer' => {-as => 'new'} ],
+ }
+});
+
+sub _rules_store {
+ no strict 'refs';
+ if (!defined *{$_[0].'::_tree_transform_rules'}{HASH}) {
+ *{$_[0].'::_tree_transform_rules'}={};
+ }
+ return *{$_[0].'::_tree_transform_rules'}{HASH};
+}
+
+sub tree_rule {
+ my (%args)=validate(@_, {
+ match => { type => SCALAR, optional => 1 },
+ action => { type => CODEREF },
+ name => { type => SCALAR, optional => 1},
+ priority => { type => SCALAR, default => 1 },
+ });
+
+ # TODO at least one of 'name' and 'match' must be specified
+
+ my $store=_rules_store(scalar caller);
+
+ push @{$store->{by_match}},\%args;
+ if ($args{name}) {
+ push @{$store->{by_name}{$args{name}}},\%args;
+ }
+
+ return;
+}
+
+sub new_transformer {
+}
+
+__PACKAGE__->meta->make_immutable;no Moose;
+__END__
+
=head1 NAME
Tree::Transform - transform tree data, like XSLT but in Perl