has 'id' => ( is =>'ro', isa => 'Int', required => 1, builder => '_labelling', init_arg => undef, ); sub _labelling { $N++ } has 'verlet' => ( is =>'rw', isa => 'ArrayRef[Molecule::Atom]', required => 1, weak_ref => 1, default => sub { [] }, ); sub add_verlet{ my $self = shift; print $self->{id},"\n"; my $array = $self->{verlet}; foreach my $obj (@_){ print "adding :", $obj->{id},"\n"; push(@{$array},$obj); weaken(@{$array}[-1]); } print "Array dim = $#{$array}\n"; } sub print_verlet{ my $self = shift; my $array = $self->{verlet}; print "Verlet from Atom ", $self->{id}, "\n"; foreach my $obj (@{$array}){ print "Verlet list :", $obj->{id},"---->\n"; } } #### $atom1a = Molecule::Atom->new(O); $atom1b = Molecule::Atom->new(X); $atom1c = Molecule::Atom->new(Y); $atom2a = Molecule::Atom->new(Z); $atom1a->add_verlet($atom1c,$atom1b); $atom1a->add_verlet($atom2a); $atom1a->print_verlet(); #### 8 adding :10 adding :9 Array dim = 1 8 adding :11 Array dim = 0 Verlet from Atom 8 #### 8 adding :10 adding :9 Array dim = 1 8 adding :11 Array dim = 2 Verlet from Atom 8 Verlet list 10 Verlet list 9 Verlet list 11 #### has 'verlet' => ( traits => ['Array'], is =>'rw', isa => 'ArrayRef[Molecule::Atom]', required => 1, weak_ref => 1, default => sub { [] }, handles => { add_atom =>'add_verlet', } );