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 >