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 },
});
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__