cast#
Attach a wizard to the variable $ref points at.
Synopsis#
use Peta::XS ':magic';
my $x;
cast(\$x, $w); # true
cast(\$x, $w); # false - same wizard twice is a no-op
cast(\$x, $other, 1, 2); # @args reach $other's data callback
What you get back#
True when the wizard was attached, false when this wizard was already on the variable (casting twice is a no-op and calls no callbacks). The cast itself fires nothing - the first get/set comes from the first read/write after it.
Contract#
If the wizard has a data callback it is called once, here, as $data_cb->(\$referent, @args), and its return value becomes the attachment’s private data (see getdata). Multiple distinct wizards may be cast on one variable; they fire most recently cast first. Readonly variables can be cast (attaching magic does not write the value - writes still croak before set would fire). The attachment lives exactly as long as the variable or until dispelled.
Examples#
## any scalar works, including aggregate elements
my @row = (1, 2, 3);
cast(\$row[1], $watch); # watch one array element
my %cfg = (mode => 'dev');
cast(\$cfg{mode}, $watch); # watch one hash value
## cast args parameterize the attachment via the data callback
my $tagged = wizard(
data => sub { my ($ref, $tag) = @_; $tag },
set => sub { warn "[$_[1]] changed\n" },
);
cast(\my $a, $tagged, 'alpha');
cast(\my $b, $tagged, 'beta');
$a = 1; # warns "[alpha] changed"
$b = 2; # warns "[beta] changed"