package Tree::Transform::XSLTish;
use strict;
use warnings;
use Sub::Exporter;
use Params::Validate ':all';
use Tree::Transform::XSLTish::Utils;
use Tree::Transform::XSLTish::Transformer;
use Carp::Clan qw(^Tree::Transform::XSLTish);
use 5.006;
our $VERSION='0.2';
my @DEFAULT_EXPORTS=('tree_rule',
'default_rules',
'new_transformer' => {-as => 'new'},
);
Sub::Exporter::setup_exporter({
exports => [qw(tree_rule default_rules new_transformer engine_class engine_factory)],
groups => {
default => \@DEFAULT_EXPORTS,
engine => [@DEFAULT_EXPORTS, qw(engine_class engine_factory)],
}
});
sub default_rules {
my $store=Tree::Transform::XSLTish::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::XSLTish::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 engine_class {
my ($classname)=@_;
Tree::Transform::XSLTish::Utils::_set_engine_factory(
scalar caller,
sub{$classname->new()},
);
return;
}
sub engine_factory(&) {
my ($new_factory)=@_;
Tree::Transform::XSLTish::Utils::_set_engine_factory(
scalar caller,
$new_factory,
);
return;
}
sub new_transformer {
my $rules_package=shift;
return Tree::Transform::XSLTish::Transformer->new(rules_package=>$rules_package,@_);
}
1;
__END__