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&#39;d like to set delegated attributes in my object cons=
tructors=C2=A0(e.g. as below)=C2=A0=C2=A0but this doesn&#39;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&gt; ( is =3D&gt; &#39;rw&#39;, isa =3D&gt; &#39;Int&#39; );</div><div>=
<br></div><div>before thing =3D&gt; sub {</div><div>=C2=A0 =C2=A0 shift;</d=
iv><div>=C2=A0 =C2=A0 print &quot;subthing: &quot;, @_ ? &#39;set to &#39; =
. (shift // &#39;&lt;undef&gt;&#39;) : &#39;(read)&#39;, &quot;\n&quot;;</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&gt; ( is =3D&gt; &#39;rw&#39;, isa =3D&gt; &#39=
;SubClass&#39;, handles =3D&gt; [&#39;thing&#39;], builder =3D&gt; &#39;_bu=
ild_sub_object&#39; );</div><div>#has sub_object =3D&gt; ( is =3D&gt; &#39;=
rw&#39;, isa =3D&gt; &#39;SubClass&#39;, handles =3D&gt; [&#39;thing&#39;],=
 default =3D&gt; 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 &quot;_build_sub_object\n&quot;;</div>=
<div>=C2=A0 =C2=A0 return SubClass-&gt;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 &quot;Start\n&quot;;</d=
iv><div>my $object =3D Class-&gt;new(thing =3D&gt; 1);</div><div>print &quo=
t;Built\n&quot;;</div><div><br></div><div>print &quot;Thing 1 =3D &quot;, (=
$object-&gt;thing // &#39;&lt;undef&gt;&#39;), &quot;\n&quot;;</div><div><b=
r></div><div>$object-&gt;thing(2);</div><div><br></div><div>print &quot;Thi=
ng 2 =3D &quot;, ($object-&gt;thing // &#39;&lt;undef&gt;&#39;), &quot;\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--