use Variable::Magic qw<wizard cast VMG_OP_INFO_NAME>;
{ # A variable tracer
- my $wiz = wizard set => sub { print "now set to ${$_[0]}!\n" },
- free => sub { print "destroyed!\n" };
+ my $wiz = wizard(
+ set => sub { print "now set to ${$_[0]}!\n" },
+ free => sub { print "destroyed!\n" },
+ );
my $a = 1;
cast $a, $wiz;
} # "destroyed!"
{ # A hash with a default value
- my $wiz = wizard data => sub { $_[1] },
- fetch => sub { $_[2] = $_[1] unless exists $_[0]->{$_[2]}; () },
- store => sub { print "key $_[2] stored in $_[-1]\n" },
- copy_key => 1,
- op_info => VMG_OP_INFO_NAME;
+ my $wiz = wizard(
+ data => sub { $_[1] },
+ fetch => sub { $_[2] = $_[1] unless exists $_[0]->{$_[2]}; () },
+ store => sub { print "key $_[2] stored in $_[-1]\n" },
+ copy_key => 1,
+ op_info => VMG_OP_INFO_NAME,
+ );
my %h = (_default => 0, apple => 2);
cast %h, $wiz, '_default';
- print $h{banana}, "\n"; # "0", because the 'banana' key doesn't exist in %h
+ print $h{banana}, "\n"; # "0" (there is no 'banana' key in %h)
$h{pear} = 1; # "key pear stored in helem"
}
=head2 C<wizard>
- wizard data => sub { ... },
- get => sub { my ($ref, $data [, $op]) = @_; ... },
- set => sub { my ($ref, $data [, $op]) = @_; ... },
- len => sub { my ($ref, $data, $len [, $op]) = @_; ... ; return $newlen; },
- clear => sub { my ($ref, $data [, $op]) = @_; ... },
- free => sub { my ($ref, $data [, $op]) = @_, ... },
- copy => sub { my ($ref, $data, $key, $elt [, $op]) = @_; ... },
- local => sub { my ($ref, $data [, $op]) = @_; ... },
- fetch => sub { my ($ref, $data, $key [, $op]) = @_; ... },
- store => sub { my ($ref, $data, $key [, $op]) = @_; ... },
- exists => sub { my ($ref, $data, $key [, $op]) = @_; ... },
- delete => sub { my ($ref, $data, $key [, $op]) = @_; ... },
- copy_key => $bool,
- op_info => [ 0 | VMG_OP_INFO_NAME | VMG_OP_INFO_OBJECT ]
+ wizard(
+ data => sub { ... },
+ get => sub { my ($ref, $data [, $op]) = @_; ... },
+ set => sub { my ($ref, $data [, $op]) = @_; ... },
+ len => sub {
+ my ($ref, $data, $len [, $op]) = @_; ... ; return $newlen
+ },
+ clear => sub { my ($ref, $data [, $op]) = @_; ... },
+ free => sub { my ($ref, $data [, $op]) = @_, ... },
+ copy => sub { my ($ref, $data, $key, $elt [, $op]) = @_; ... },
+ local => sub { my ($ref, $data [, $op]) = @_; ... },
+ fetch => sub { my ($ref, $data, $key [, $op]) = @_; ... },
+ store => sub { my ($ref, $data, $key [, $op]) = @_; ... },
+ exists => sub { my ($ref, $data, $key [, $op]) = @_; ... },
+ delete => sub { my ($ref, $data, $key [, $op]) = @_; ... },
+ copy_key => $bool,
+ op_info => [ 0 | VMG_OP_INFO_NAME | VMG_OP_INFO_OBJECT ],
+ )
This function creates a 'wizard', an opaque type that holds the magic information.
It takes a list of keys / values as argument, whose keys can be :
Here's a simple usage example :
# A simple scalar tracer
- my $wiz = wizard get => sub { print STDERR "got ${$_[0]}\n" },
- set => sub { print STDERR "set to ${$_[0]}\n" },
- free => sub { print STDERR "${$_[0]} was deleted\n" }
+ my $wiz = wizard(
+ get => sub { print STDERR "got ${$_[0]}\n" },
+ set => sub { print STDERR "set to ${$_[0]}\n" },
+ free => sub { print STDERR "${$_[0]} was deleted\n" },
+ );
=cut
unless (defined $data) {
$data = \(my $slot);
&cast($var, $wiz, $slot)
- or die "Couldn't cast UserData magic onto the variable";
+ or die "Couldn't cast UserData magic onto the variable";
}
$$data;
}