]> git.vpit.fr Git - perl/modules/Variable-Magic.git/blob - README
This is 0.47
[perl/modules/Variable-Magic.git] / README
1 NAME
2     Variable::Magic - Associate user-defined magic to variables from Perl.
3
4 VERSION
5     Version 0.47
6
7 SYNOPSIS
8         use Variable::Magic qw<wizard cast VMG_OP_INFO_NAME>;
9
10         { # A variable tracer
11          my $wiz = wizard(
12           set  => sub { print "now set to ${$_[0]}!\n" },
13           free => sub { print "destroyed!\n" },
14          );
15
16          my $a = 1;
17          cast $a, $wiz;
18          $a = 2;        # "now set to 2!"
19         }               # "destroyed!"
20
21         { # A hash with a default value
22          my $wiz = wizard(
23           data     => sub { $_[1] },
24           fetch    => sub { $_[2] = $_[1] unless exists $_[0]->{$_[2]}; () },
25           store    => sub { print "key $_[2] stored in $_[-1]\n" },
26           copy_key => 1,
27           op_info  => VMG_OP_INFO_NAME,
28          );
29
30          my %h = (_default => 0, apple => 2);
31          cast %h, $wiz, '_default';
32          print $h{banana}, "\n"; # "0" (there is no 'banana' key in %h)
33          $h{pear} = 1;           # "key pear stored in helem"
34         }
35
36 DESCRIPTION
37     Magic is Perl's way of enhancing variables. This mechanism lets the user
38     add extra data to any variable and hook syntactical operations (such as
39     access, assignment or destruction) that can be applied to it. With this
40     module, you can add your own magic to any variable without having to
41     write a single line of XS.
42
43     You'll realize that these magic variables look a lot like tied
44     variables. It's not surprising, as tied variables are implemented as a
45     special kind of magic, just like any 'irregular' Perl variable : scalars
46     like $!, $( or $^W, the %ENV and %SIG hashes, the @ISA array, "vec()"
47     and "substr()" lvalues, threads::shared variables... They all share the
48     same underlying C API, and this module gives you direct access to it.
49
50     Still, the magic made available by this module differs from tieing and
51     overloading in several ways :
52
53     *   It isn't copied on assignment.
54
55         You attach it to variables, not values (as for blessed references).
56
57     *   It doesn't replace the original semantics.
58
59         Magic callbacks usually get triggered before the original action
60         takes place, and can't prevent it from happening. This also makes
61         catching individual events easier than with "tie", where you have to
62         provide fallbacks methods for all actions by usually inheriting from
63         the correct "Tie::Std*" class and overriding individual methods in
64         your own class.
65
66     *   It's type-agnostic.
67
68         The same magic can be applied on scalars, arrays, hashes, subs or
69         globs. But the same hook (see below for a list) may trigger
70         differently depending on the the type of the variable.
71
72     *   It's mostly invisible at the Perl level.
73
74         Magical and non-magical variables cannot be distinguished with
75         "ref", "tied" or another trick.
76
77     *   It's notably faster.
78
79         Mainly because perl's way of handling magic is lighter by nature,
80         and because there's no need for any method resolution. Also, since
81         you don't have to reimplement all the variable semantics, you only
82         pay for what you actually use.
83
84     The operations that can be overloaded are :
85
86     *   "get"
87
88         This magic is invoked when the variable is evaluated. It is never
89         called for arrays and hashes.
90
91     *   "set"
92
93         This one is triggered each time the value of the variable changes.
94         It is called for array subscripts and slices, but never for hashes.
95
96     *   "len"
97
98         This magic is a little special : it is called when the 'size' or the
99         'length' of the variable has to be known by Perl. Typically, it's
100         the magic involved when an array is evaluated in scalar context, but
101         also on array assignment and loops ("for", "map" or "grep"). The
102         callback has then to return the length as an integer.
103
104     *   "clear"
105
106         This magic is invoked when the variable is reset, such as when an
107         array is emptied. Please note that this is different from undefining
108         the variable, even though the magic is called when the clearing is a
109         result of the undefine (e.g. for an array, but actually a bug
110         prevent it to work before perl 5.9.5 - see the history).
111
112     *   "free"
113
114         This one can be considered as an object destructor. It happens when
115         the variable goes out of scope, but not when it is undefined.
116
117     *   "copy"
118
119         This magic only applies to tied arrays and hashes. It fires when you
120         try to access or change their elements. It is available on your perl
121         iff "MGf_COPY" is true.
122
123     *   "dup"
124
125         Invoked when the variable is cloned across threads. Currently not
126         available.
127
128     *   "local"
129
130         When this magic is set on a variable, all subsequent localizations
131         of the variable will trigger the callback. It is available on your
132         perl iff "MGf_LOCAL" is true.
133
134     The following actions only apply to hashes and are available iff
135     "VMG_UVAR" is true. They are referred to as "uvar" magics.
136
137     *   "fetch"
138
139         This magic happens each time an element is fetched from the hash.
140
141     *   "store"
142
143         This one is called when an element is stored into the hash.
144
145     *   "exists"
146
147         This magic fires when a key is tested for existence in the hash.
148
149     *   "delete"
150
151         This last one triggers when a key is deleted in the hash, regardless
152         of whether the key actually exists in it.
153
154     You can refer to the tests to have more insight of where the different
155     magics are invoked.
156
157 FUNCTIONS
158   "wizard"
159         wizard(
160          data     => sub { ... },
161          get      => sub { my ($ref, $data [, $op]) = @_; ... },
162          set      => sub { my ($ref, $data [, $op]) = @_; ... },
163          len      => sub {
164           my ($ref, $data, $len [, $op]) = @_; ... ; return $newlen
165          },
166          clear    => sub { my ($ref, $data [, $op]) = @_; ... },
167          free     => sub { my ($ref, $data [, $op]) = @_, ... },
168          copy     => sub { my ($ref, $data, $key, $elt [, $op]) = @_; ... },
169          local    => sub { my ($ref, $data [, $op]) = @_; ... },
170          fetch    => sub { my ($ref, $data, $key [, $op]) = @_; ... },
171          store    => sub { my ($ref, $data, $key [, $op]) = @_; ... },
172          exists   => sub { my ($ref, $data, $key [, $op]) = @_; ... },
173          delete   => sub { my ($ref, $data, $key [, $op]) = @_; ... },
174          copy_key => $bool,
175          op_info  => [ 0 | VMG_OP_INFO_NAME | VMG_OP_INFO_OBJECT ],
176         )
177
178     This function creates a 'wizard', an opaque type that holds the magic
179     information. It takes a list of keys / values as argument, whose keys
180     can be :
181
182     *   "data"
183
184         A code (or string) reference to a private data constructor. It is
185         called each time this magic is cast on a variable, and the scalar
186         returned is used as private data storage for it. $_[0] is a
187         reference to the magic object and @_[1 .. @_-1] are all extra
188         arguments that were passed to "cast".
189
190     *   "get", "set", "len", "clear", "free", "copy", "local", "fetch",
191         "store", "exists" and "delete"
192
193         Code (or string) references to the corresponding magic callbacks.
194         You don't have to specify all of them : the magic associated with
195         undefined entries simply won't be hooked. In those callbacks, $_[0]
196         is always a reference to the magic object and $_[1] is always the
197         private data (or "undef" when no private data constructor was
198         supplied).
199
200         Moreover, when you pass "op_info => $num" to "wizard", the last
201         element of @_ will be the current op name if "$num ==
202         VMG_OP_INFO_NAME" and a "B::OP" object representing the current op
203         if "$num == VMG_OP_INFO_OBJECT". Both have a performance hit, but
204         just getting the name is lighter than getting the op object.
205
206         Other arguments are specific to the magic hooked :
207
208         *       "len"
209
210                 When the variable is an array or a scalar, $_[2] contains
211                 the non-magical length. The callback can return the new
212                 scalar or array length to use, or "undef" to default to the
213                 normal length.
214
215         *       "copy"
216
217                 $_[2] is a either a copy or an alias of the current key,
218                 which means that it is useless to try to change or cast
219                 magic on it. $_[3] is an alias to the current element (i.e.
220                 the value).
221
222         *       "fetch", "store", "exists" and "delete"
223
224                 $_[2] is an alias to the current key. Nothing prevents you
225                 from changing it, but be aware that there lurk dangerous
226                 side effects. For example, it may rightfully be readonly if
227                 the key was a bareword. You can get a copy instead by
228                 passing "copy_key => 1" to "wizard", which allows you to
229                 safely assign to $_[2] in order to e.g. redirect the action
230                 to another key. This however has a little performance
231                 drawback because of the copy.
232
233         All the callbacks are expected to return an integer, which is passed
234         straight to the perl magic API. However, only the return value of
235         the "len" callback currently holds a meaning.
236
237     Each callback can be specified as a code or a string reference, in which
238     case the function denoted by the string will be used as the callback.
239
240     Note that "free" callbacks are *never* called during global destruction,
241     as there's no way to ensure that the wizard and the "free" callback
242     weren't destroyed before the variable.
243
244     Here's a simple usage example :
245
246         # A simple scalar tracer
247         my $wiz = wizard(
248          get  => sub { print STDERR "got ${$_[0]}\n" },
249          set  => sub { print STDERR "set to ${$_[0]}\n" },
250          free => sub { print STDERR "${$_[0]} was deleted\n" },
251         );
252
253   "cast"
254         cast [$@%&*]var, $wiz, ...
255
256     This function associates $wiz magic to the variable supplied, without
257     overwriting any other kind of magic. It returns true on success or when
258     $wiz magic is already present, and croaks on error. All extra arguments
259     specified after $wiz are passed to the private data constructor in @_[1
260     .. @_-1]. If the variable isn't a hash, any "uvar" callback of the
261     wizard is safely ignored.
262
263         # Casts $wiz onto $x, and pass '1' to the data constructor.
264         my $x;
265         cast $x, $wiz, 1;
266
267     The "var" argument can be an array or hash value. Magic for those
268     behaves like for any other scalar, except that it is dispelled when the
269     entry is deleted from the container. For example, if you want to call
270     "POSIX::tzset" each time the 'TZ' environment variable is changed in
271     %ENV, you can use :
272
273         use POSIX;
274         cast $ENV{TZ}, wizard set => sub { POSIX::tzset(); () };
275
276     If you want to overcome the possible deletion of the 'TZ' entry, you
277     have no choice but to rely on "store" uvar magic.
278
279   "getdata"
280         getdata [$@%&*]var, $wiz
281
282     This accessor fetches the private data associated with the magic $wiz in
283     the variable. It croaks when $wiz do not represent a valid magic object,
284     and returns an empty list if no such magic is attached to the variable
285     or when the wizard has no data constructor.
286
287         # Get the attached data, or undef if the wizard does not attach any.
288         my $data = getdata $x, $wiz;
289
290   "dispell"
291         dispell [$@%&*]variable, $wiz
292
293     The exact opposite of "cast" : it dissociates $wiz magic from the
294     variable. This function returns true on success, 0 when no magic
295     represented by $wiz could be found in the variable, and croaks if the
296     supplied wizard is invalid.
297
298         # Dispell now.
299         die 'no such magic in $x' unless dispell $x, $wiz;
300
301 CONSTANTS
302   "MGf_COPY"
303     Evaluates to true iff the 'copy' magic is available.
304
305   "MGf_DUP"
306     Evaluates to true iff the 'dup' magic is available.
307
308   "MGf_LOCAL"
309     Evaluates to true iff the 'local' magic is available.
310
311   "VMG_UVAR"
312     When this constant is true, you can use the "fetch,store,exists,delete"
313     callbacks on hashes. Initial VMG_UVAR capability was introduced in perl
314     5.9.5, with a fully functional implementation shipped with perl 5.10.0.
315
316   "VMG_COMPAT_SCALAR_LENGTH_NOLEN"
317     True for perls that don't call 'len' magic when taking the "length" of a
318     magical scalar.
319
320   "VMG_COMPAT_ARRAY_PUSH_NOLEN"
321     True for perls that don't call 'len' magic when you push an element in a
322     magical array. Starting from perl 5.11.0, this only refers to pushes in
323     non-void context and hence is false.
324
325   "VMG_COMPAT_ARRAY_PUSH_NOLEN_VOID"
326     True for perls that don't call 'len' magic when you push in void context
327     an element in a magical array.
328
329   "VMG_COMPAT_ARRAY_UNSHIFT_NOLEN_VOID"
330     True for perls that don't call 'len' magic when you unshift in void
331     context an element in a magical array.
332
333   "VMG_COMPAT_ARRAY_UNDEF_CLEAR"
334     True for perls that call 'clear' magic when undefining magical arrays.
335
336   "VMG_COMPAT_HASH_DELETE_NOUVAR_VOID"
337     True for perls that don't call 'delete' uvar magic when you delete an
338     element from a hash in void context.
339
340   "VMG_COMPAT_GLOB_GET"
341     True for perls that call 'get' magic for operations on globs.
342
343   "VMG_PERL_PATCHLEVEL"
344     The perl patchlevel this module was built with, or 0 for non-debugging
345     perls.
346
347   "VMG_THREADSAFE"
348     True iff this module could have been built with thread-safety features
349     enabled.
350
351   "VMG_FORKSAFE"
352     True iff this module could have been built with fork-safety features
353     enabled. This will always be true except on Windows where it's false for
354     perl 5.10.0 and below .
355
356   "VMG_OP_INFO_NAME"
357     Value to pass with "op_info" to get the current op name in the magic
358     callbacks.
359
360   "VMG_OP_INFO_OBJECT"
361     Value to pass with "op_info" to get a "B::OP" object representing the
362     current op in the magic callbacks.
363
364 COOKBOOK
365   Associate an object to any perl variable
366     This technique can be useful for passing user data through limited APIs.
367     It is similar to using inside-out objects, but without the drawback of
368     having to implement a complex destructor.
369
370         {
371          package Magical::UserData;
372
373          use Variable::Magic qw<wizard cast getdata>;
374
375          my $wiz = wizard data => sub { \$_[1] };
376
377          sub ud (\[$@%*&]) : lvalue {
378           my ($var) = @_;
379           my $data = &getdata($var, $wiz);
380           unless (defined $data) {
381            $data = \(my $slot);
382            &cast($var, $wiz, $slot)
383                      or die "Couldn't cast UserData magic onto the variable";
384           }
385           $$data;
386          }
387         }
388
389         {
390          BEGIN { *ud = \&Magical::UserData::ud }
391
392          my $cb;
393          $cb = sub { print 'Hello, ', ud(&$cb), "!\n" };
394
395          ud(&$cb) = 'world';
396          $cb->(); # Hello, world!
397         }
398
399   Recursively cast magic on datastructures
400     "cast" can be called from any magical callback, and in particular from
401     "data". This allows you to recursively cast magic on datastructures :
402
403         my $wiz;
404         $wiz = wizard data => sub {
405          my ($var, $depth) = @_;
406          $depth ||= 0;
407          my $r = ref $var;
408          if ($r eq 'ARRAY') {
409           &cast((ref() ? $_ : \$_), $wiz, $depth + 1) for @$var;
410          } elsif ($r eq 'HASH') {
411           &cast((ref() ? $_ : \$_), $wiz, $depth + 1) for values %$var;
412          }
413          return $depth;
414         },
415         free => sub {
416          my ($var, $depth) = @_;
417          my $r = ref $var;
418          print "free $r at depth $depth\n";
419          ();
420         };
421
422         {
423          my %h = (
424           a => [ 1, 2 ],
425           b => { c => 3 }
426          );
427          cast %h, $wiz;
428         }
429
430     When %h goes out of scope, this will print something among the lines of
431     :
432
433         free HASH at depth 0
434         free HASH at depth 1
435         free SCALAR at depth 2
436         free ARRAY at depth 1
437         free SCALAR at depth 3
438         free SCALAR at depth 3
439
440     Of course, this example does nothing with the values that are added
441     after the "cast".
442
443 PERL MAGIC HISTORY
444     The places where magic is invoked have changed a bit through perl
445     history. Here's a little list of the most recent ones.
446
447     *   5.6.x
448
449         *p14416* : 'copy' and 'dup' magic.
450
451     *   5.8.9
452
453         *p28160* : Integration of *p25854* (see below).
454
455         *p32542* : Integration of *p31473* (see below).
456
457     *   5.9.3
458
459         *p25854* : 'len' magic is no longer called when pushing an element
460         into a magic array.
461
462         *p26569* : 'local' magic.
463
464     *   5.9.5
465
466         *p31064* : Meaningful 'uvar' magic.
467
468         *p31473* : 'clear' magic wasn't invoked when undefining an array.
469         The bug is fixed as of this version.
470
471     *   5.10.0
472
473         Since "PERL_MAGIC_uvar" is uppercased, "hv_magic_check()" triggers
474         'copy' magic on hash stores for (non-tied) hashes that also have
475         'uvar' magic.
476
477     *   5.11.x
478
479         *p32969* : 'len' magic is no longer invoked when calling "length"
480         with a magical scalar.
481
482         *p34908* : 'len' magic is no longer called when pushing / unshifting
483         an element into a magical array in void context. The "push" part was
484         already covered by *p25854*.
485
486         *g9cdcb38b* : 'len' magic is called again when pushing into a
487         magical array in non-void context.
488
489 EXPORT
490     The functions "wizard", "cast", "getdata" and "dispell" are only
491     exported on request. All of them are exported by the tags ':funcs' and
492     ':all'.
493
494     All the constants are also only exported on request, either individually
495     or by the tags ':consts' and ':all'.
496
497 CAVEATS
498     If you store a magic object in the private data slot, the magic won't be
499     accessible by "getdata" since it's not copied by assignment. The only
500     way to address this would be to return a reference.
501
502     If you define a wizard with a "free" callback and cast it on itself,
503     this destructor won't be called because the wizard will be destroyed
504     first.
505
506     In order to define magic on hash members, you need at least perl 5.10.0
507     (see "VMG_UVAR")
508
509 DEPENDENCIES
510     perl 5.8.
511
512     A C compiler. This module may happen to build with a C++ compiler as
513     well, but don't rely on it, as no guarantee is made in this regard.
514
515     Carp (standard since perl 5), XSLoader (standard since perl 5.006).
516
517     Copy tests need Tie::Array (standard since perl 5.005) and Tie::Hash
518     (since 5.002).
519
520     Some uvar tests need Hash::Util::FieldHash (standard since perl
521     5.009004).
522
523     Glob tests need Symbol (standard since perl 5.002).
524
525     Threads tests need threads and threads::shared.
526
527 SEE ALSO
528     perlguts and perlapi for internal information about magic.
529
530     perltie and overload for other ways of enhancing objects.
531
532 AUTHOR
533     Vincent Pit, "<perl at profvince.com>", <http://www.profvince.com>.
534
535     You can contact me by mail or on "irc.perl.org" (vincent).
536
537 BUGS
538     Please report any bugs or feature requests to "bug-variable-magic at
539     rt.cpan.org", or through the web interface at
540     <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Variable-Magic>. I will
541     be notified, and then you'll automatically be notified of progress on
542     your bug as I make changes.
543
544 SUPPORT
545     You can find documentation for this module with the perldoc command.
546
547         perldoc Variable::Magic
548
549     Tests code coverage report is available at
550     <http://www.profvince.com/perl/cover/Variable-Magic>.
551
552 COPYRIGHT & LICENSE
553     Copyright 2007,2008,2009,2010,2011 Vincent Pit, all rights reserved.
554
555     This program is free software; you can redistribute it and/or modify it
556     under the same terms as Perl itself.
557