Hi yary,

BUILD and TWEAK work during the object creation time, not at the attribute
assignment time, as far as I know, and I don't have the value to assign to
the attribute at the object creation time yet.

On Tue, Nov 14, 2017 at 6:59 PM, yary <not....@gmail.com> wrote:

> Fernando, this list recently had a discussion on object creation, and all
> various ways the attributes are checked and set by the various stages. From
> that, what you want is TWEAK, or perhaps BUILD, which let you do things
> with the attribute values when the object is created. I leave the research
> to you (or more verbose, and wiser, list members)...I'm too buuusy!
>
> -y
>
> On Tue, Nov 14, 2017 at 6:51 PM, Fernando Santagata <
> nando.santag...@gmail.com> wrote:
>
>> Hi Liz,
>>
>> What I need is to preprocess the value before assigning it to an
>> attribute.
>>
>> I would do that in Perl5/Moose, using "around", like this:
>>
>> package A;
>> use Moose;
>>
>> has 'attribute' => (is => 'rw', isa => 'Str');
>>
>> around [qw(attribute)] => sub {
>>   my ($next, $self, $val) = @_;
>>   return $self->$next unless $val;
>>   return $self->$next(preprocess $val); # Preprocess the value before the
>> assignment
>> }
>>
>> In this way I don't have to make an explicit call to the preprocessor any
>> time I assign a value to that attribute, effectively removing that from the
>> main program.
>>
>> I'm looking for a way to do that in Perl6.
>>
>> On Tue, Nov 14, 2017 at 6:11 PM, Elizabeth Mattijsen <l...@dijkmat.nl>
>> wrote:
>>
>>> > On 14 Nov 2017, at 18:06, Fernando Santagata <
>>> nando.santag...@gmail.com> wrote:
>>> > I'm converting a program from Perl5/Moose.
>>> > I have several classes, each has some attributes that need to be
>>> processed in the same way before being passed to other objects.
>>> >
>>> > When I was using Moose, I had some "around" methods that would
>>> automatically modify the value before delivering it to those attributes, so
>>> delegating the object to do the needed adjustments.
>>> >
>>> > Stripped to the bare bones, the thing that in Perl6 looks like this:
>>> >
>>> > class A {
>>> >   has $!a;
>>> >
>>> >   method a($val?)
>>> >   {
>>> >     if $val.defined {
>>> >       # Modify $val in some way
>>> >       $!a = $val;
>>> >     } else {
>>> >       $!a;
>>> >     }
>>> >   }
>>> > }
>>> >
>>> > my A $a .= new;
>>> > # $a.a = 42; # This outputs an error
>>> > $a.a(42);
>>> > say $a.a;
>>> >
>>> > Any hint how to make it work as an assignment, instead of a method
>>> call?
>>> > Better yet, is there a way to abstract that behavior in a role?
>>>
>>> I think you want “is rw” on a public attribute?
>>>
>>> class A {
>>>     has $.a is rw;
>>> }
>>> my $obj = A.new;
>>> $obj.a = 42;
>>> dd $obj;
>>> ===========
>>> A $obj = A.new(a => 42)
>>>
>>>
>>>
>>> Liz
>>
>>
>>
>>
>> --
>> Fernando Santagata
>>
>
>


-- 
Fernando Santagata

Reply via email to