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 >