11 __PACKAGE__->meta->add_attribute(
12 Class::MOP::Attribute->new('$:uid' => (
17 ("$instance" =~ /\((.*?)\)$/);
22 __PACKAGE__->meta->add_attribute(
23 Class::MOP::Attribute->new('$:node' => (
24 reader => 'getNodeValue',
25 writer => 'setNodeValue',
30 __PACKAGE__->meta->add_attribute(
31 Class::MOP::Attribute->new('$:parent' => (
32 predicate => 'hasParent',
33 reader => 'getParent',
38 __PACKAGE__->meta->add_attribute(
39 Class::MOP::Attribute->new('$:left' => (
40 predicate => 'hasLeft',
44 my ($self, $tree) = @_;
45 $tree->setParent($self) if defined $tree;
46 $self->{'$:left'} = $tree;
53 __PACKAGE__->meta->add_attribute(
54 Class::MOP::Attribute->new('$:right' => (
55 predicate => 'hasRight',
59 my ($self, $tree) = @_;
60 $tree->setParent($self) if defined $tree;
61 $self->{'$:right'} = $tree;
70 bless $class->meta->construct_instance(':node' => shift) => $class;
75 my $left = $self->getLeft();
76 $left->setParent(undef);
77 $self->setLeft(undef);
83 my $right = $self->getRight;
84 $right->setParent(undef);
85 $self->setRight(undef);
91 return (!$self->hasLeft && !$self->hasRight);
96 return !$self->hasParent;
100 my ($self, $func) = @_;
102 $self->getLeft->traverse($func) if $self->hasLeft;
103 $self->getRight->traverse($func) if $self->hasRight;
108 # swap left for right
109 my $left = $self->getLeft;
110 $self->setLeft($self->getRight());
111 $self->setRight($left);
113 $self->getLeft->mirror() if $self->hasLeft();
114 $self->getRight->mirror() if $self->hasRight();
121 $size += $self->getLeft->size() if $self->hasLeft();
122 $size += $self->getRight->size() if $self->hasRight();
128 my ($left_height, $right_height) = (0, 0);
129 $left_height = $self->getLeft->height() if $self->hasLeft();
130 $right_height = $self->getRight->height() if $self->hasRight();
131 return 1 + (($left_height > $right_height) ? $left_height : $right_height);