Change your example to say $at->foo instead of $at->dump to see the bug.
Add a check in the around to only try to set foo if @_ actually had 3 elements. Then the bug should go away. I suggest that the documentation add a comment like this: # Return the existing value if we are not trying to change it. return $self->$orig() unless @_; That might keep someone else from making the same mistake. On Fri, Aug 7, 2015 at 9:27 AM, Chris Prather <perig...@prather.org> wrote: > So you'll need to provide a reduced example that demonstrates the behavior > your showing. When I tried to reproduce (with the script below) the > attribute was being set just fine. > > #!/usr/bin/env perl > use 5.12.1; > use warnings; > > { > > package AroundTest; > use Moose; > > has foo => ( is => 'rw' ); > around foo => sub { > my ( $next, $self, $seq ) = @_; > $seq = uc($seq); > $self->$next($seq); > }; > } > > my $at = AroundTest->new(); > $at->foo('bar'); > say $at->dump; > > > > On Thu, Aug 6, 2015 at 7:04 PM, Marcos Barbeitos <msbarbei...@gmail.com> > wrote: >> >> Howdy, >> >> I looked up the behavior of the modifier 'around' in >> <http://search.cpan.org/~ether/Moose-2.1600/lib/Moose/Manual/MethodModifiers.pod#Around_modifiers>, >> and the code snipet is: >> >> around 'size' => sub { >> my $orig = shift; >> my $self = shift; >> >> return $self->$orig() >> unless @_; >> >> my $size = shift; >> $size = $size / 2 >> if $self->likes_small_things(); >> >> return $self->$orig($size); >> }; >> >> In my code, I have: >> >> has 'sequence' => >> ( >> is => 'rw' >> , isa => 'Str' >> , predicate => 'has_sequence' >> ); >> >> around 'sequence' => sub >> { >> my $orig = shift; >> my $self = shift; >> my $sequence = uc shift; >> >> # Do lots of things with $sequence and then >> >> return $self->$orig( $sequence ); >> } >> >> But the attribute is not set. >> >> I've tried lots of variations of the last line: >> >> $self->$orig( $sequence ); >> return $orig->( $self, $sequence ); >> $orig->( $self, $sequence ); >> return $sequence; >> >> With no success, as expected. However, if I do: >> >> around 'sequence' => sub >> { >> my $orig = shift; >> my $self = shift; >> >> return $self->$orig( @_ ); >> } >> >> The attribute is set and life goes on. Of course, that does not work for >> me because I need to do a bunch of things to the argument passed to this >> method. >> >> Any ideas about the reasons for the (apparent?) discrepancy in behavior? >> >> Best wishes and thanks in advance. >> >> -- >> Marcos S. Barbeitos >> >> Departamento de Zoologia - Sala 360 >> Setor de Ciências Biológicas >> Universidade Federal do Paraná >> Caixa Postal 19020 >> Curitiba, PR 81531-990 >> Brazil >> >> Phone: (55 41) 3361-1634 > >