package Tree::Transform; use strict; use warnings; 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'; Sub::Exporter::setup_exporter({ exports => [qw(tree_rule default_rules new_transformer)], groups => { default => [ 'tree_rule', 'default_rules', 'new_transformer' => {-as => 'new'} ], } }); sub default_rules { my $store=Tree::Transform::Utils::_rules_store(scalar caller); push @{$store->{by_match}}, {match=> '/',priority=>0,action=>sub { $_[0]->apply_rules } }, {match=> '*',priority=>0,action=>sub { $_[0]->apply_rules } }, ; return; } 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 # TODO default priority mased on match my $store=Tree::Transform::Utils::_rules_store(scalar caller); if ($args{match}) { push @{$store->{by_match}},\%args; } if ($args{name}) { if (exists $store->{by_name}{$args{name}}) { carp "Duplicate rule named $args{name}, ignoring"; return; } $store->{by_name}{$args{name}}=\%args; } return; } sub _transformer_class { 'Tree::Transform::Transformer' }; sub new_transformer { my ($rules_package)=@_; return _transformer_class->new(rules_package=>$rules_package); } 1; __END__ =head1 NAME Tree::Transform - transform tree data, like XSLT but in Perl =head1 AUTHOR Gianni Ceccarelli =cut