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