Этот вопрос практически повторяет Применение прокси с использованием признаков. Однако этот вопрос касается применения прокси к атрибуту, и я хотел бы сделать то же самое для переменной. Из ответа Джонатана я понимаю, что я
необходимо организовать привязку прокси к атрибуту, чтобы там был прокси, а не скалярный контейнер, который обычно создается логикой инициализации класса.
Однако я не могу успешно выполнить привязку к переменной: D даже во время компиляции. (В том числе с nqp :: bind). Буду очень признателен за любые указатели в правильном направлении.
(В идеале я хотел бы поддерживать использование переменной / признака с синтаксисом присваивания. В идеальном мире у меня был бы синтаксис вроде:
my $thing is custom-proxy = 42;
И результатом этого будет то, что $thing
будет помещен в контейнер внутри прокси, но не в скаляре. Но если это невозможно, я бы согласился заставить его работать с привязкой через :=
.
[ИЗМЕНИТЬ: основываясь на принятом ниже ответе, это можно в основном сделать с помощью следующего кода:
multi trait_mod:<is>(Variable \v, :$tom) {
v.block.add_phaser(
'ENTER',
v.willdo(<-> $_ {
$_ = Proxy.new:
STORE => -> $, $v { say "store $v" },
FETCH => { say "fetch!"; 42}
}, 1))
}
Это работает для переменных, которые не инициализированы другим значением, или для state
переменных при вызовах функции, отличной от первой.