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

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

Thread Previous | Thread Next
From:
Chris Prather
Date:
August 7, 2015 21:09
Subject:
Re: 'around' method modifier does not seem to work
Message ID:
1438981770245.5432f7da@Nodemailer
If you check the part he quoted in the original email, that is in there. Obviously three of us missed it so maybe it could be highlighted better.




-Chris

On Fri, Aug 7, 2015 at 2:28 PM, Ben Tilly <btilly@gmail.com> wrote:

> 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