Setting delegated attributes in constructors
[email protected] (Merlyn Kline) Tue, 13 Feb 2018 10:17:19 +0000
| Newsgroups | perl.moose |
|---|---|
| Message-ID | <CALbMOkBP8_Q7TddYawHsq3HanT5ju5u5gRt5YLBg1kkbk3_fpQ@mail.gmail.com> |
--001a11449d38603fed0565154dd1
Content-Type: text/plain; charset="UTF-8"
I'd like to set delegated attributes in my object constructors (e.g. as
below) but this doesn't seem to work. Am I missing something?
Merlyn
#!/usr/bin/perl
package SubClass;
use Moose;
has thing => ( is => 'rw', isa => 'Int' );
before thing => sub {
shift;
print "subthing: ", @_ ? 'set to ' . (shift // '<undef>') : '(read)',
"\n";
return;
};
package Class;
use Moose;
has sub_object => ( is => 'rw', isa => 'SubClass', handles => ['thing'],
builder => '_build_sub_object' );
#has sub_object => ( is => 'rw', isa => 'SubClass', handles => ['thing'],
default => sub { _build_sub_object(); } );
sub _build_sub_object {
my $self = shift;
print "_build_sub_object\n";
return SubClass->new;
}
package main;
use strict;
use warnings;
print "Start\n";
my $object = Class->new(thing => 1);
print "Built\n";
print "Thing 1 = ", ($object->thing // '<undef>'), "\n";
$object->thing(2);
print "Thing 2 = ", ($object->thing // '<undef>'), "\n";
--
--
Merlyn
--001a11449d38603fed0565154dd1
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">I'd like to set delegated attributes in my object cons=
tructors=C2=A0(e.g. as below)=C2=A0=C2=A0but this doesn't seem to work.=
Am I missing something?<div><br></div><div>Merlyn</div><div><br></div><div=
><br></div><div><div>#!/usr/bin/perl</div><div><br></div><div>package SubCl=
ass;</div><div><br></div><div>use Moose;</div><div><br></div><div>has thing=
=3D> ( is =3D> 'rw', isa =3D> 'Int' );</div><div>=
<br></div><div>before thing =3D> sub {</div><div>=C2=A0 =C2=A0 shift;</d=
iv><div>=C2=A0 =C2=A0 print "subthing: ", @_ ? 'set to ' =
. (shift // '<undef>') : '(read)', "\n";</d=
iv><div>=C2=A0 =C2=A0 return;</div><div>};</div><div><br></div><div><br></d=
iv><div>package Class;</div><div><br></div><div>use Moose;</div><div><br></=
div><div>has sub_object =3D> ( is =3D> 'rw', isa =3D> '=
;SubClass', handles =3D> ['thing'], builder =3D> '_bu=
ild_sub_object' );</div><div>#has sub_object =3D> ( is =3D> '=
rw', isa =3D> 'SubClass', handles =3D> ['thing'],=
default =3D> sub { _build_sub_object(); } );</div><div><br></div><div>s=
ub _build_sub_object {</div><div>=C2=A0 =C2=A0 my $self =3D shift;</div><di=
v><br></div><div>=C2=A0 =C2=A0 print "_build_sub_object\n";</div>=
<div>=C2=A0 =C2=A0 return SubClass->new;</div><div>}</div><div><br></div=
><div><br></div><div>package main;</div><div><br></div><div>use strict;</di=
v><div>use warnings;</div><div><br></div><div>print "Start\n";</d=
iv><div>my $object =3D Class->new(thing =3D> 1);</div><div>print &quo=
t;Built\n";</div><div><br></div><div>print "Thing 1 =3D ", (=
$object->thing // '<undef>'), "\n";</div><div><b=
r></div><div>$object->thing(2);</div><div><br></div><div>print "Thi=
ng 2 =3D ", ($object->thing // '<undef>'), "\n&q=
uot;;</div><div><br></div></div></div>-- <br><div dir=3D"ltr" class=3D"gmai=
l_signature" data-smartmail=3D"gmail_signature"><div dir=3D"ltr"><p dir=3D"=
ltr">-- <br>
Merlyn<br></p>
</div></div>
--001a11449d38603fed0565154dd1--