summaryrefslogtreecommitdiff
path: root/lib/Tree/Transform.pm
blob: 7b9af2cd79318181db9874adf91204de25123795 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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
 
=head1 AUTHOR
 
Gianni Ceccarelli <dakkar@thenautilus.net>
 
=cut