assemble tag expression into binary tree, respecting precedence
[id3fs.git] / lib / ID3FS / Path / Node.pm
1 package ID3FS::Path::Node;
2
3 use strict;
4 use warnings;
5
6 sub new
7 {
8     my $proto=shift;
9     my $class=ref($proto) || $proto;
10     my $self={};
11     bless($self,$class);
12
13     $self->left(shift);
14     $self->op(shift);
15     $self->right(shift);
16
17     return $self;
18 }
19
20 sub set
21 {
22     my($self, $name, $val)=@_;
23     if(defined($val))
24     {
25         $self->{$name}=$val;
26     }
27     return $self->{$name};
28 }
29
30 sub left  { return shift->set("left",  shift); }
31 sub right { return shift->set("right", shift); }
32 sub op    { return shift->set("op",    shift); }
33
34 sub print
35 {
36     my($self)=@_;
37     my $op=$self->op();
38     my $left=$self->left();
39     my $right=$self->right();
40     return "" unless($left || $right);
41     my $str .= $self->print_node($left);
42     $str .= (" " . $op->{name} . " ") if($op);
43     $str .= $self->print_node($right);
44     if($op || ($left && $right))
45     {
46         $str="(" . $str . ")";
47     }
48     return $str;
49 }
50
51 sub print_node
52 {
53     my($self, $node)=@_;
54     return "" unless(defined($node));
55     return $node->print() if(ref($node) eq "ID3FS::Path::Node");
56     return $node->{name};
57 }
58
59 1;