Ah yes, sorry! I'll wait for another answer along with you now.

On Tue, Nov 14, 2017, 7:05 PM Fernando Santagata <nando.santag...@gmail.com>
wrote:

> 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