Hi Matthew, given this fragment > > has 'mylist' => (isa => 'ArrayRef', default => sub { [] }); > > at a point in my code later on I want to clear it to reset it so I do > > $self->mylist([]); > > Is there anyway I could invoke the default? Something like > > $self->mylist()->default(); >
That would require $self->mylist returning an object rather than an ArrayRef. Obviously that's possible -- you could implement 'mylist' as an object which contains elements and has it's own default() method -- however, if you wanted to keep it as an ArrayRef then one way would be to create a builder for your attribute, then implement your own reset_mylist() method which resets the attribute using that builder. package My::Foo; use Moose; has 'mylist', is => 'rw', isa => 'ArrayRef', builder => '_build_mylist'; sub _build_mylist { [ ] } sub reset_mylist { (shift)->{mylist} = _build_mylist() } sub print_mylist { my $self = shift; print @{ $self->mylist } ? join( ", ", @{ $self->mylist } ) : "mylist is empty"; print "\n"; } package main; my $o = My::Foo->new(); $o->print_mylist; # mylist is empty $o->mylist( [1, 2, 3] ); $o->print_mylist; # 1, 2, 3 $o->reset_mylist; $o->print_mylist; # mylist is empty If you haven't already then you might want to have a look at: http://search.cpan.org/~sartak/MooseX-AttributeHelpers-0.14/lib/MooseX/AttributeHelpers.pm Cheers, Ian -- Ian Sillitoe CATH Team -- http://cathdb.info