File Coverage

blib/lib/Variable/Magic.pm
Criterion Covered Total %
statement 32 32 100.0
branch 4 4 100.0
condition n/a
subroutine 7 7 100.0
pod 1 1 100.0
total 44 44 100.0


line stmt bran cond sub pod time code
1             package Variable::Magic;
2              
3 28     28   457872 use 5.008;
  28         72  
4              
5 28     28   98 use strict;
  28         30  
  28         476  
6 28     28   85 use warnings;
  28         40  
  28         1093  
7              
8             =head1 NAME
9              
10             Variable::Magic - Associate user-defined magic to variables from Perl.
11              
12             =head1 VERSION
13              
14             Version 0.61
15              
16             =cut
17              
18             our $VERSION;
19             BEGIN {
20 28     28   1398 $VERSION = '0.61';
21             }
22              
23             =head1 SYNOPSIS
24              
25             use Variable::Magic qw;
26              
27             { # A variable tracer
28             my $wiz = wizard(
29             set => sub { print "now set to ${$_[0]}!\n" },
30             free => sub { print "destroyed!\n" },
31             );
32              
33             my $a = 1;
34             cast $a, $wiz;
35             $a = 2; # "now set to 2!"
36             } # "destroyed!"
37              
38             { # A hash with a default value
39             my $wiz = wizard(
40             data => sub { $_[1] },
41             fetch => sub { $_[2] = $_[1] unless exists $_[0]->{$_[2]}; () },
42             store => sub { print "key $_[2] stored in $_[-1]\n" },
43             copy_key => 1,
44             op_info => VMG_OP_INFO_NAME,
45             );
46              
47             my %h = (_default => 0, apple => 2);
48             cast %h, $wiz, '_default';
49             print $h{banana}, "\n"; # "0" (there is no 'banana' key in %h)
50             $h{pear} = 1; # "key pear stored in helem"
51             }
52              
53             =head1 DESCRIPTION
54              
55             Magic is Perl's way of enhancing variables.
56             This mechanism lets the user add extra data to any variable and hook syntactical operations (such as access, assignment or destruction) that can be applied to it.
57             With this module, you can add your own magic to any variable without having to write a single line of XS.
58              
59             You'll realize that these magic variables look a lot like tied variables.
60             It is not surprising, as tied variables are implemented as a special kind of magic, just like any 'irregular' Perl variable : scalars like C<$!>, C<$(> or C<$^W>, the C<%ENV> and C<%SIG> hashes, the C<@ISA> array, C and C lvalues, L variables...
61             They all share the same underlying C API, and this module gives you direct access to it.
62              
63             Still, the magic made available by this module differs from tieing and overloading in several ways :
64              
65             =over 4
66              
67             =item *
68              
69             Magic is not copied on assignment.
70              
71             You attach it to variables, not values (as for blessed references).
72              
73             =item *
74              
75             Magic does not replace the original semantics.
76              
77             Magic callbacks usually get triggered before the original action takes place, and cannot prevent it from happening.
78             This also makes catching individual events easier than with C, where you have to provide fallbacks methods for all actions by usually inheriting from the correct C class and overriding individual methods in your own class.
79              
80             =item *
81              
82             Magic is multivalued.
83              
84             You can safely apply different kinds of magics to the same variable, and each of them will be invoked successively.
85              
86             =item *
87              
88             Magic is type-agnostic.
89              
90             The same magic can be applied on scalars, arrays, hashes, subs or globs.
91             But the same hook (see below for a list) may trigger differently depending on the type of the variable.
92              
93             =item *
94              
95             Magic is invisible at Perl level.
96              
97             Magical and non-magical variables cannot be distinguished with C, C or another trick.
98              
99             =item *
100              
101             Magic is notably faster.
102              
103             Mainly because perl's way of handling magic is lighter by nature, and because there is no need for any method resolution.
104             Also, since you don't have to reimplement all the variable semantics, you only pay for what you actually use.
105              
106             =back
107              
108             The operations that can be overloaded are :
109              
110             =over 4
111              
112             =item *
113              
114             I
115              
116             This magic is invoked when the variable is evaluated.
117             It is never called for arrays and hashes.
118              
119             =item *
120              
121             I
122              
123             This magic is called each time the value of the variable changes.
124             It is called for array subscripts and slices, but never for hashes.
125              
126             =item *
127              
128             I
129              
130             This magic only applies to arrays (though it used to also apply to scalars), and is triggered when the 'size' or the 'length' of the variable has to be known by Perl.
131             This is typically the magic involved when an array is evaluated in scalar context, but also on array assignment and loops (C, C or C).
132             The length is returned from the callback as an integer.
133              
134             Starting from perl 5.12, this magic is no longer called by the C keyword, and starting from perl 5.17.4 it is also no longer called for scalars in any situation, making this magic only meaningful on arrays.
135             You can use the constants L and L to see if this magic is available for scalars or not.
136              
137             =item *
138              
139             I
140              
141             This magic is invoked when the variable is reset, such as when an array is emptied.
142             Please note that this is different from undefining the variable, even though the magic is called when the clearing is a result of the undefine (e.g. for an array, but actually a bug prevent it to work before perl 5.9.5 - see the L).
143              
144             =item *
145              
146             I
147              
148             This magic is called when a variable is destroyed as the result of going out of scope (but not when it is undefined).
149             It behaves roughly like Perl object destructors (i.e. C methods), except that exceptions thrown from inside a I callback will always be propagated to the surrounding code.
150              
151             =item *
152              
153             I
154              
155             When applied to tied arrays and hashes, this magic fires when you try to access or change their elements.
156              
157             Starting from perl 5.17.0, it can also be applied to closure prototypes, in which case the magic will be called when the prototype is cloned.
158             The L constant is true when your perl support this feature.
159              
160             =item *
161              
162             I
163              
164             This magic is invoked when the variable is cloned across threads.
165             It is currently not available.
166              
167             =item *
168              
169             I
170              
171             When this magic is set on a variable, all subsequent localizations of the variable will trigger the callback.
172             It is available on your perl if and only if C is true.
173              
174             =back
175              
176             The following actions only apply to hashes and are available if and only if L is true.
177             They are referred to as I magics.
178              
179             =over 4
180              
181             =item *
182              
183             I
184              
185             This magic is invoked each time an element is fetched from the hash.
186              
187             =item *
188              
189             I
190              
191             This one is called when an element is stored into the hash.
192              
193             =item *
194              
195             I
196              
197             This magic fires when a key is tested for existence in the hash.
198              
199             =item *
200              
201             I
202              
203             This magic is triggered when a key is deleted in the hash, regardless of whether the key actually exists in it.
204              
205             =back
206              
207             You can refer to the tests to have more insight of where the different magics are invoked.
208              
209             =head1 FUNCTIONS
210              
211             =cut
212              
213             BEGIN {
214 28     28   101 require XSLoader;
215 28         19864 XSLoader::load(__PACKAGE__, $VERSION);
216             }
217              
218             =head2 C
219              
220             wizard(
221             data => sub { ... },
222             get => sub { my ($ref, $data [, $op]) = @_; ... },
223             set => sub { my ($ref, $data [, $op]) = @_; ... },
224             len => sub {
225             my ($ref, $data, $len [, $op]) = @_; ... ; return $newlen
226             },
227             clear => sub { my ($ref, $data [, $op]) = @_; ... },
228             free => sub { my ($ref, $data [, $op]) = @_, ... },
229             copy => sub { my ($ref, $data, $key, $elt [, $op]) = @_; ... },
230             local => sub { my ($ref, $data [, $op]) = @_; ... },
231             fetch => sub { my ($ref, $data, $key [, $op]) = @_; ... },
232             store => sub { my ($ref, $data, $key [, $op]) = @_; ... },
233             exists => sub { my ($ref, $data, $key [, $op]) = @_; ... },
234             delete => sub { my ($ref, $data, $key [, $op]) = @_; ... },
235             copy_key => $bool,
236             op_info => [ 0 | VMG_OP_INFO_NAME | VMG_OP_INFO_OBJECT ],
237             )
238              
239             This function creates a 'wizard', an opaque object that holds the magic information.
240             It takes a list of keys / values as argument, whose keys can be :
241              
242             =over 4
243              
244             =item *
245              
246             C
247              
248             A code (or string) reference to a private data constructor.
249             It is called in scalar context each time the magic is cast onto a variable, with C<$_[0]> being a reference to this variable and C<@_[1 .. @_-1]> being all extra arguments that were passed to L.
250             The scalar returned from this call is then attached to the variable and can be retrieved later with L.
251              
252             =item *
253              
254             C, C, C, C, C, C, C, C, C, C and C
255              
256             Code (or string) references to the respective magic callbacks.
257             You don't have to specify all of them : the magic corresponding to undefined entries will simply not be hooked.
258              
259             When those callbacks are executed, C<$_[0]> is a reference to the magic variable and C<$_[1]> is the associated private data (or C when no private data constructor is supplied with the wizard).
260             Other arguments depend on which kind of magic is involved :
261              
262             =over 8
263              
264             =item *
265              
266             I
267              
268             C<$_[2]> contains the natural, non-magical length of the variable (which can only be a scalar or an array as I magic is only relevant for these types).
269             The callback is expected to return the new scalar or array length to use, or C to default to the normal length.
270              
271             =item *
272              
273             I
274              
275             When the variable for which the magic is invoked is an array or an hash, C<$_[2]> is a either an alias or a copy of the current key, and C<$_[3]> is an alias to the current element (i.e. the value).
276             Since C<$_[2]> might be a copy, it is useless to try to change it or cast magic on it.
277              
278             Starting from perl 5.17.0, this magic can also be called for code references.
279             In this case, C<$_[2]> is always C and C<$_[3]> is a reference to the cloned anonymous subroutine.
280              
281             =item *
282              
283             I, I, I and I
284              
285             C<$_[2]> is an alias to the current key.
286             Note that C<$_[2]> may rightfully be readonly if the key comes from a bareword, and as such it is unsafe to assign to it.
287             You can ask for a copy instead by passing C<< copy_key => 1 >> to L which, at the price of a small performance hit, allows you to safely assign to C<$_[2]> in order to e.g. redirect the action to another key.
288              
289             =back
290              
291             Finally, if C<< op_info => $num >> is also passed to C, then one extra element is appended to C<@_>.
292             Its nature depends on the value of C<$num> :
293              
294             =over 8
295              
296             =item *
297              
298             C
299              
300             C<$_[-1]> is the current op name.
301              
302             =item *
303              
304             C
305              
306             C<$_[-1]> is the C object for the current op.
307              
308             =back
309              
310             Both result in a small performance hit, but just getting the name is lighter than getting the op object.
311              
312             These callbacks are always executed in scalar context.
313             The returned value is coerced into a signed integer, which is then passed straight to the perl magic API.
314             However, note that perl currently only cares about the return value of the I magic callback and ignores all the others.
315             Starting with Variable::Magic 0.58, a reference returned from a non-I magic callback will not be destroyed immediately but will be allowed to survive until the end of the statement that triggered the magic.
316             This lets you use this return value as a token for triggering a destructor after the original magic action takes place.
317             You can see an example of this technique in the L.
318              
319             =back
320              
321             Each callback can be specified as :
322              
323             =over 4
324              
325             =item *
326              
327             a code reference, which will be called as a subroutine.
328              
329             =item *
330              
331             a string reference, where the string denotes which subroutine is to be called when magic is triggered.
332             If the subroutine name is not fully qualified, then the current package at the time the magic is invoked will be used instead.
333              
334             =item *
335              
336             a reference to C, in which case a no-op magic callback is installed instead of the default one.
337             This may especially be helpful for I magic, where an empty callback prevents magic from being copied during localization.
338              
339             =back
340              
341             Note that I magic is never called during global destruction, as there is no way to ensure that the wizard object and the callback were not destroyed before the variable.
342              
343             Here is a simple usage example :
344              
345             # A simple scalar tracer
346             my $wiz = wizard(
347             get => sub { print STDERR "got ${$_[0]}\n" },
348             set => sub { print STDERR "set to ${$_[0]}\n" },
349             free => sub { print STDERR "${$_[0]} was deleted\n" },
350             );
351              
352             =cut
353              
354             sub wizard {
355 182 100   182 1 1962959 if (@_ % 2) {
356 4         33 require Carp;
357 4         649 Carp::croak('Wrong number of arguments for wizard()');
358             }
359              
360 178         467 my %opts = @_;
361              
362 178         430 my @keys = qw;
363 178         234 push @keys, 'local' if MGf_LOCAL;
364 178         251 push @keys, qw if VMG_UVAR;
365              
366 178         299 my ($wiz, $err);
367             {
368 178         138 local $@;
  178         154  
369 178         193 $wiz = eval { _wizard(map $opts{$_}, @keys) };
  178         1839  
370 178         319 $err = $@;
371             }
372 178 100       292 if ($err) {
373 1         6 $err =~ s/\sat\s+.*?\n//;
374 1         7 require Carp;
375 1         184 Carp::croak($err);
376             }
377              
378 177         702 return $wiz;
379             }
380              
381             =head2 C
382              
383             cast [$@%&*]var, $wiz, @args
384              
385             This function associates C<$wiz> magic to the supplied variable, without overwriting any other kind of magic.
386             It returns true on success or when C<$wiz> magic is already attached, and croaks on error.
387             When C<$wiz> provides a data constructor, it is called just before magic is cast onto the variable, and it receives a reference to the target variable in C<$_[0]> and the content of C<@args> in C<@_[1 .. @args]>.
388             Otherwise, C<@args> is ignored.
389              
390             # Casts $wiz onto $x, passing (\$x, '1') to the data constructor.
391             my $x;
392             cast $x, $wiz, 1;
393              
394             The C argument can be an array or hash value.
395             Magic for these scalars behaves like for any other, except that it is dispelled when the entry is deleted from the container.
396             For example, if you want to call C each time the C<'TZ'> environment variable is changed in C<%ENV>, you can use :
397              
398             use POSIX;
399             cast $ENV{TZ}, wizard set => sub { POSIX::tzset(); () };
400              
401             If you want to handle the possible deletion of the C<'TZ'> entry, you must also specify I magic.
402              
403             =head2 C
404              
405             getdata [$@%&*]var, $wiz
406              
407             This accessor fetches the private data associated with the magic C<$wiz> in the variable.
408             It croaks when C<$wiz> does not represent a valid magic object, and returns an empty list if no such magic is attached to the variable or when the wizard has no data constructor.
409              
410             # Get the data attached to $wiz in $x, or undef if $wiz
411             # did not attach any.
412             my $data = getdata $x, $wiz;
413              
414             =head2 C
415              
416             dispell [$@%&*]variable, $wiz
417              
418             The exact opposite of L : it dissociates C<$wiz> magic from the variable.
419             This function returns true on success, C<0> when no magic represented by C<$wiz> could be found in the variable, and croaks if the supplied wizard is invalid.
420              
421             # Dispell now.
422             die 'no such magic in $x' unless dispell $x, $wiz;
423              
424             =head1 CONSTANTS
425              
426             =head2 C
427              
428             Evaluates to true if and only if the I magic is available.
429             This is the case for perl 5.7.3 and greater, which is ensured by the requirements of this module.
430              
431             =head2 C
432              
433             Evaluates to true if and only if the I magic is available.
434             This is the case for perl 5.7.3 and greater, which is ensured by the requirements of this module.
435              
436             =head2 C
437              
438             Evaluates to true if and only if the I magic is available.
439             This is the case for perl 5.9.3 and greater.
440              
441             =head2 C
442              
443             When this constant is true, you can use the I, I, I and I magics on hashes.
444             Initial L capability was introduced in perl 5.9.5, with a fully functional implementation shipped with perl 5.10.0.
445              
446             =head2 C
447              
448             True for perls that don't call I magic when taking the C of a magical scalar.
449              
450             =head2 C
451              
452             True for perls that don't call I magic on scalars.
453             Implies L.
454              
455             =head2 C
456              
457             True for perls that don't call I magic when you push an element in a magical array.
458             Starting from perl 5.11.0, this only refers to pushes in non-void context and hence is false.
459              
460             =head2 C
461              
462             True for perls that don't call I magic when you push in void context an element in a magical array.
463              
464             =head2 C
465              
466             True for perls that don't call I magic when you unshift in void context an element in a magical array.
467              
468             =head2 C
469              
470             True for perls that call I magic when undefining magical arrays.
471              
472             =head2 C
473              
474             True for perls that don't call I magic when you delete an element from a hash in void context.
475              
476             =head2 C
477              
478             True for perls that call I magic when a magical closure prototype is cloned.
479              
480             =head2 C
481              
482             True for perls that call I magic for operations on globs.
483              
484             =head2 C
485              
486             The perl patchlevel this module was built with, or C<0> for non-debugging perls.
487              
488             =head2 C
489              
490             True if and only if this module could have been built with thread-safety features enabled.
491              
492             =head2 C
493              
494             True if and only if this module could have been built with fork-safety features enabled.
495             This is always true except on Windows where it is false for perl 5.10.0 and below.
496              
497             =head2 C
498              
499             Value to pass with C to get the current op name in the magic callbacks.
500              
501             =head2 C
502              
503             Value to pass with C to get a C object representing the current op in the magic callbacks.
504              
505             =head1 COOKBOOK
506              
507             =head2 Associate an object to any perl variable
508              
509             This technique can be useful for passing user data through limited APIs.
510             It is similar to using inside-out objects, but without the drawback of having to implement a complex destructor.
511              
512             {
513             package Magical::UserData;
514              
515             use Variable::Magic qw;
516              
517             my $wiz = wizard data => sub { \$_[1] };
518              
519             sub ud (\[$@%*&]) : lvalue {
520             my ($var) = @_;
521             my $data = &getdata($var, $wiz);
522             unless (defined $data) {
523             $data = \(my $slot);
524             &cast($var, $wiz, $slot)
525             or die "Couldn't cast UserData magic onto the variable";
526             }
527             $$data;
528             }
529             }
530              
531             {
532             BEGIN { *ud = \&Magical::UserData::ud }
533              
534             my $cb;
535             $cb = sub { print 'Hello, ', ud(&$cb), "!\n" };
536              
537             ud(&$cb) = 'world';
538             $cb->(); # Hello, world!
539             }
540              
541             =head2 Recursively cast magic on datastructures
542              
543             C can be called from any magical callback, and in particular from C.
544             This allows you to recursively cast magic on datastructures :
545              
546             my $wiz;
547             $wiz = wizard data => sub {
548             my ($var, $depth) = @_;
549             $depth ||= 0;
550             my $r = ref $var;
551             if ($r eq 'ARRAY') {
552             &cast((ref() ? $_ : \$_), $wiz, $depth + 1) for @$var;
553             } elsif ($r eq 'HASH') {
554             &cast((ref() ? $_ : \$_), $wiz, $depth + 1) for values %$var;
555             }
556             return $depth;
557             },
558             free => sub {
559             my ($var, $depth) = @_;
560             my $r = ref $var;
561             print "free $r at depth $depth\n";
562             ();
563             };
564              
565             {
566             my %h = (
567             a => [ 1, 2 ],
568             b => { c => 3 }
569             );
570             cast %h, $wiz;
571             }
572              
573             When C<%h> goes out of scope, this prints something among the lines of :
574              
575             free HASH at depth 0
576             free HASH at depth 1
577             free SCALAR at depth 2
578             free ARRAY at depth 1
579             free SCALAR at depth 3
580             free SCALAR at depth 3
581              
582             Of course, this example does nothing with the values that are added after the C.
583              
584             =head2 Delayed magic actions
585              
586             Starting with Variable::Magic 0.58, the return value of the magic callbacks can be used to delay the action until after the original action takes place :
587              
588             my $delayed;
589             my $delayed_aux = wizard(
590             data => sub { $_[1] },
591             free => sub {
592             my ($target) = $_[1];
593             my $target_data = &getdata($target, $delayed);
594             local $target_data->{guard} = 1;
595             if (ref $target eq 'SCALAR') {
596             my $orig = $$target;
597             $$target = $target_data->{mangler}->($orig);
598             }
599             return;
600             },
601             );
602             $delayed = wizard(
603             data => sub {
604             return +{ guard => 0, mangler => $_[1] };
605             },
606             set => sub {
607             return if $_[1]->{guard};
608             my $token;
609             cast $token, $delayed_aux, $_[0];
610             return \$token;
611             },
612             );
613             my $x = 1;
614             cast $x, $delayed => sub { $_[0] * 2 };
615             $x = 2;
616             # $x is now 4
617             # But note that the delayed action only takes place at the end of the
618             # current statement :
619             my @y = ($x = 5, $x);
620             # $x is now 10, but @y is (5, 5)
621              
622             =head1 PERL MAGIC HISTORY
623              
624             The places where magic is invoked have changed a bit through perl history.
625             Here is a little list of the most recent ones.
626              
627             =over 4
628              
629             =item *
630              
631             B<5.6.x>
632              
633             I : I and I magic.
634              
635             =item *
636              
637             B<5.8.9>
638              
639             I : Integration of I (see below).
640              
641             I : Integration of I (see below).
642              
643             =item *
644              
645             B<5.9.3>
646              
647             I : I magic is no longer called when pushing an element into a magic array.
648              
649             I : I magic.
650              
651             =item *
652              
653             B<5.9.5>
654              
655             I : Meaningful I magic.
656              
657             I : I magic was not invoked when undefining an array.
658             The bug is fixed as of this version.
659              
660             =item *
661              
662             B<5.10.0>
663              
664             Since C is uppercased, C triggers I magic on hash stores for (non-tied) hashes that also have I magic.
665              
666             =item *
667              
668             B<5.11.x>
669              
670             I : I magic is no longer invoked when calling C with a magical scalar.
671              
672             I : I magic is no longer called when pushing / unshifting an element into a magical array in void context.
673             The C part was already covered by I.
674              
675             I : I magic is called again when pushing into a magical array in non-void context.
676              
677             =back
678              
679             =head1 EXPORT
680              
681             The functions L, L, L and L are only exported on request.
682             All of them are exported by the tags C<':funcs'> and C<':all'>.
683              
684             All the constants are also only exported on request, either individually or by the tags C<':consts'> and C<':all'>.
685              
686             =cut
687              
688 28     28   141 use base qw;
  28         35  
  28         4614  
689              
690             our @EXPORT = ();
691             our %EXPORT_TAGS = (
692             'funcs' => [ qw ],
693             'consts' => [ qw<
694             MGf_COPY MGf_DUP MGf_LOCAL VMG_UVAR
695             VMG_COMPAT_SCALAR_LENGTH_NOLEN
696             VMG_COMPAT_SCALAR_NOLEN
697             VMG_COMPAT_ARRAY_PUSH_NOLEN VMG_COMPAT_ARRAY_PUSH_NOLEN_VOID
698             VMG_COMPAT_ARRAY_UNSHIFT_NOLEN_VOID
699             VMG_COMPAT_ARRAY_UNDEF_CLEAR
700             VMG_COMPAT_HASH_DELETE_NOUVAR_VOID
701             VMG_COMPAT_CODE_COPY_CLONE
702             VMG_COMPAT_GLOB_GET
703             VMG_PERL_PATCHLEVEL
704             VMG_THREADSAFE VMG_FORKSAFE
705             VMG_OP_INFO_NAME VMG_OP_INFO_OBJECT
706             > ],
707             );
708             our @EXPORT_OK = map { @$_ } values %EXPORT_TAGS;
709             $EXPORT_TAGS{'all'} = [ @EXPORT_OK ];
710              
711             =head1 CAVEATS
712              
713             In order to hook hash operations with magic, you need at least perl 5.10.0 (see L).
714              
715             If you want to store a magic object in the private data slot, you will not be able to recover the magic with L, since magic is not copied by assignment.
716             You can work around this gotcha by storing a reference to the magic object instead.
717              
718             If you define a wizard with I magic and cast it on itself, it results in a memory cycle, so this destructor will not be called when the wizard is freed.
719              
720             =head1 DEPENDENCIES
721              
722             L 5.8.
723              
724             A C compiler.
725             This module may happen to build with a C++ compiler as well, but don't rely on it, as no guarantee is made in this regard.
726              
727             L (core since perl 5), L (since 5.6.0).
728              
729             =head1 SEE ALSO
730              
731             L and L for internal information about magic.
732              
733             L and L for other ways of enhancing objects.
734              
735             =head1 AUTHOR
736              
737             Vincent Pit, C<< >>, L.
738              
739             You can contact me by mail or on C (vincent).
740              
741             =head1 BUGS
742              
743             Please report any bugs or feature requests to C, or through the web interface at L.
744             I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
745              
746             =head1 SUPPORT
747              
748             You can find documentation for this module with the perldoc command.
749              
750             perldoc Variable::Magic
751              
752             =head1 COPYRIGHT & LICENSE
753              
754             Copyright 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017 Vincent Pit, all rights reserved.
755              
756             This program is free software; you can redistribute it and/or modify it
757             under the same terms as Perl itself.
758              
759             =cut
760              
761             1; # End of Variable::Magic