
=head1 NAME

Treex::PML::Struct - PML attribute value structure

=head1 DESCRIPTION

This class implements the data type 'structure'.  Structure consists
of items called members. Each member is a name-value pair, where the
name uniquely determines the member within the structure
(i.e. distinct members of a structure have distinct names).

=over 4

=cut

package Treex::PML::Struct;
use Carp;
use warnings;

use vars qw($VERSION);
BEGIN {
  $VERSION='2.07'; # version template
}
use strict;
use UNIVERSAL::DOES;

=item Treex::PML::Struct->new ({name=>value, ...},reuse?)

NOTE: Don't call this constructor directly, use Treex::PML::Factory->createStructure() instead!

Create a new structure (optionally initializing its members).  If
reuse is true, the hash reference passed may be reused (re-blessed)
into the structure.

=cut

sub new {
  my ($class,$hash,$reuse) = @_;
  if (ref $hash) {
    return $reuse ? bless $hash, $class 
                  : bless Treex::PML::CloneValue($hash), $class;
  } else {
    return bless {}, $class;
  }
}

=item $struct->get_member ($name)

Return value of the given member.

=cut

sub get_member {
  my ($self,$name) = @_;
  return unless defined $name;
  return $self->{$name};
}

=item $struct->set_member ($name,$value)

Set value of the given member.

=cut

sub set_member {
  my ($self,$name,$value) = @_;
  return unless defined $name;
  return $self->{$name}=$value;
}


=item $struct->delete_member ($name)

Delete the given member (returning its last value).

=cut

sub delete_member {
  my ($self,$name) = @_;
  return unless defined $name;
  return delete $self->{$name};
}

=item $struct->members ()

Return (assorted) list of names of all members.

=cut

sub members {
  return keys %{$_[0]};
}


=back

=cut

sub DESTROY {
  my ($self) = @_;
  %{$self}=(); # this should not be needed, but
               # without it, perl 5.10 leaks on weakened
               # structures, try:
               #   Scalar::Util::weaken({}) while 1
}

1;
__END__

=head1 SEE ALSO

L<Treex::PML>, L<Treex::PML::Factory>, L<Treex::PML::Schema>, L<Treex::PML::Container>, L<Treex::PML::Seq>, L<Treex::PML::Node>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2006-2010 by Petr Pajas

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.2 or,
at your option, any later version of Perl 5 you may have available.

=cut
