package Tree;

sub new {
  my ($class, $data, @children) = @_;
  my $self = { DATA => $data, CHILDREN => \@children, 
               PARENT => undef };
  bless $self => $class;
  $_->set_parent($self) for @children;
  return $self;
}

sub set_parent {
  my $self = shift;
  $self->{PARENT} = shift;
}

sub parent { $_[0]{PARENT} }
sub children { @{$_[0]{CHILDREN}} }
sub data { $_[0]{DATA} }

sub to_string {
  my $self = shift;
  my $depth = shift || 0;
  my $I = "| " x $depth;
  my $str = $I . $self->data . "\n";
  $str .= $_->to_string($depth+1) for $self->children;
  return $str;
}

sub print {
  my ($self, $fh) = @_;
  $fh ||= \*STDOUT;
  print $fh $self->to_string;
}

sub break_links {
  my ($self) = shift;
  for ($self->children) { $_->break_links }
  undef $self->{PARENT};
}

1;
