develooper Front page | perl.moose | Postings from August 2015

Re: 'around' method modifier does not seem to work

Thread Previous | Thread Next
From:
Ben Tilly
Date:
August 7, 2015 18:29
Subject:
Re: 'around' method modifier does not seem to work
Message ID:
CANoac9Ukr4rW4f18bfSHFXpBD6EP9krrraSqAvvHBg0hzxx-tg@mail.gmail.com
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 <perigrin@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 <msbarbeitos@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
>
>

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About