# New Ticket Created by "Carl Mäsak" # Please include the string: [perl #126198] # in the subject line of all future correspondence about this issue. # <URL: https://rt.perl.org/Ticket/Display.html?id=126198 >
moritz++' gist inlined for your convenience: our $count = 0; class MagicVal { has Int $.constant; has Int $.varies = 0; method varies is rw { $count++; return-rw Proxy.new( # note that FETCH and STORE cannot go through the accessors # of $.varies again, because that would lead to infinite # recursion. Use the actual attribute here instead FETCH => method () { $!varies }, STORE => method ($new) { $!varies = $new + 1 }, ); } } my $mv = MagicVal.new(:constant(6), :varies(6)); say $mv.varies.VAR.^name; # Proxy say $mv.varies.^name; # Method <moritz> m: https://gist.github.com/moritz/5cda6371ab3cfec3254e <camelia> rakudo-moar 0132b6: OUTPUT«ProxyMethod» <moritz> why does the last line print Method here? <moritz> and not Int? <masak> good question. <masak> does just `$mv.varies` print 6? <moritz> masak: no, it says <anon> <masak> sounds wrong to me. <ShimmerFairy> moritz: Well, it's because you mapped those keys to Method objects, no? <masak> ShimmerFairy: isn't that the way you implement a Proxy, though? <masak> you give FETCH and STORE a callable each. doesn't mean they get exposed. <ShimmerFairy> masak: I've never seen the method keyword used with it, I don't think. Just plain closures <masak> ShimmerFairy: the presence of the `method` keyword there is practically irrelevant. <moritz> ShimmerFairy: the 'method' keyword just means they get an invocant <masak> m: my &c1 = sub ($obj, $x) { say "$obj: $x" }; my &c2 = method ($obj: $x) { say "$obj: $x" }; c1("OH HAI", 42); "OH HAI".&c2(42) <camelia> rakudo-moar 0132b6: OUTPUT«OH HAI: 42OH HAI: 42» <masak> ShimmerFairy: ^ <masak> it's only a matter of intent, not a matter of differing semantics. <moritz> huh <moritz> but changing it to a sub instead helps indeed <moritz> wtf? <masak> ok, bug * masak submits rakudobug <masak> it's probably special-cased where it oughtn't be <jdv79> i think i ran into that a few months ago and just ignored it when someone showed me the working one <masak> let's fix it instead :P