#!/usr/bin/perl use strict; use warnings; use Devel::Peek; use Variable::Magic qw( wizard cast getdata ); my $b = 'Hello, world!'; my $a = bless( do { \$b; }, 'main' ); print Dump($a); print "===========================================\n"; package Magical::UserData; sub BEGIN { require Variable::Magic; do { 'Variable::Magic'->import( 'wizard', 'cast', 'getdata' ); }; } package main; { package Magical::UserData; my $wiz = wizard( 'data', sub { \$_[1]; } ); sub ud (\[$@%*&]) : lvalue { my ($var) = @_; my $data = &getdata( $var, $wiz ); unless ( defined $data ) { $data = \my ($slot); die q[Couldn't cast UserData magic onto the variable] unless &cast( $var, $wiz, $slot ); } $$data; } } sub BEGIN { *ud = \&Magical::UserData::ud; } { my $cb; $cb = sub { print 'Hello, ', &ud( \&$cb ), "!\n"; }; &ud( \&$cb ) = 'world'; print Dump( &$cb() ); }