]> git.vpit.fr Git - perl/modules/autovivification.git/commitdiff
This is 0.01 v0.01
authorVincent Pit <vince@profvince.com>
Sun, 14 Jun 2009 20:08:03 +0000 (22:08 +0200)
committerVincent Pit <vince@profvince.com>
Sun, 14 Jun 2009 20:08:03 +0000 (22:08 +0200)
Changes
MANIFEST
META.yml
README

diff --git a/Changes b/Changes
index 0389cf8eb8ba1de06acf0e992b1e91e1647ea824..dfd6379f858ee827037b73d06a9021af168c2cbb 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,5 @@
 Revision history for autovivification
 
-0.01
+0.01    2009-06-14 20:10 UTC
         First version, released on an unsuspecting world.
 
index 3c387d5dd3772f5b3a5812752f029a471dedbdcd..a4cfc0f95c6bfa486d0a1b8b8f9990b6449b9554 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -15,3 +15,5 @@ t/91-pod.t
 t/92-pod-coverage.t
 t/95-portability-files.t
 t/99-kwalitee.t
+t/lib/autovivification/TestRequired1.pm
+t/lib/autovivification/TestRequired2.pm
index f83088073a06df6eede23e2584a23c409feb6ce7..82d09fd47977f025994b6228fb508b5d42d34c06 100644 (file)
--- a/META.yml
+++ b/META.yml
@@ -1,7 +1,7 @@
 --- #YAML:1.0
 name:               autovivification
 version:            0.01
-abstract:           ~
+abstract:           Lexically disable autovivification.
 author:
     - Vincent Pit <perl@profvince.com>
 license:            perl
diff --git a/README b/README
index 880269e46da66b1c75e82674b06341158e6a4aac..bc02476f9e3f05f259c232398cd3f16c35f6deb9 100644 (file)
--- a/README
+++ b/README
@@ -6,24 +6,96 @@ VERSION
 
 SYNOPSIS
         no autovivification;
-        my $x;
-        $x->{foo} = 1; # croaks
+
+        my $hashref;
+
+        my $a = $hashref->{key_a};       # $hashref stays undef
+
+        if (exists $hashref->{option}) { # Still undef
+         ...
+        }
+
+        delete $hashref->{old};          # Still undef again
+
+        $hashref->{new} = $value;        # Vivifies to { new => $value }
 
 DESCRIPTION
+    When an undefined variable is dereferenced, it gets silently upgraded to
+    an array or hash reference (depending of the type of the dereferencing).
+    This behaviour is called *autovivification* and usually does what you
+    mean (e.g. when you store a value) but it's sometimes unnatural or
+    surprising because your variables gets populated behind your back. This
+    is especially true when several levels of dereferencing are involved, in
+    which case all levels are vivified up to the last, or when it happens in
+    intuitively read-only constructs like "exists".
+
+    This pragma lets you disable autovivification for some constructs and
+    optionally throws a warning or an error when it would have happened.
+
 METHODS
-  "unimport"
-    Magically called when "no autovivification" is encountered. Turns the
-    module on.
+  "unimport @opts"
+    Magically called when "no autovivification" is encountered. Enables the
+    features given in @opts, which can be :
+
+    *   'fetch'
+
+        Turn off autovivification for rvalue dereferencing expressions, such
+        as "$value = $hashref->{key}[$idx]{$field}". "undef" is returned
+        when the expression would have autovivified.
+
+    *   'exists'
+
+        Turn off autovivification for dereferencing expressions that are
+        parts of an "exists", such as "exists
+        $hashref->{key}[$idx]{$field}". '' is returned when the expression
+        would have autovivified.
+
+    *   'delete'
+
+        Turn off autovivification for dereferencing expressions that are
+        parts of a "delete", such as "delete $hashref->{key}[$idx]{$field}".
+        "undef" is returned when the expression would have autovivified.
 
-  "import"
-    Magically called when "use autovivification" is encountered. Turns the
-    module off.
+    *   'store'
+
+        Turn off autovivification for lvalue dereferencing expressions, such
+        as "$hashref->{key}[$idx]{$field} = $value". An exception is thrown
+        if vivification is needed to store the value, which means that
+        effectively you can only assign to levels that are already defined
+        (in the example, this would require "$hashref->{key}[$idx]" to
+        already be a hash reference).
+
+    *   'warn'
+
+        Emit a warning when an autovivification is avoided.
+
+    *   'strict'
+
+        Throw an exception when an autovivification is avoided.
+
+    Each call to "unimport" adds the specified features to the ones already
+    in use in the current lexical scope.
+
+    When @opts is empty, it defaults to "qw/fetch exists delete/".
+
+  "import @opts"
+    Magically called when "use autovivification" is encountered. Disables
+    the features given in @opts, which can be the same as for "unimport".
+
+    Each call to "import" removes the specified features to the ones already
+    in use in the current lexical scope.
+
+    When @opts is empty, it defaults to restoring the original Perl
+    autovivification behaviour.
 
 DEPENDENCIES
     perl 5.8.
 
     XSLoader (standard since perl 5.006).
 
+SEE ALSO
+    perlref.
+
 AUTHOR
     Vincent Pit, "<perl at profvince.com>", <http://www.profvince.com>.
 
@@ -44,6 +116,9 @@ SUPPORT
     Tests code coverage report is available at
     <http://www.profvince.com/perl/cover/autovivification>.
 
+ACKNOWLEDGEMENTS
+    Matt S. Trout asked for it.
+
 COPYRIGHT & LICENSE
     Copyright 2009 Vincent Pit, all rights reserved.