perlopentut.pod, #3: The last of the content changes.
[p5sagit/p5-mst-13.2.git] / pod / perlsub.pod
index cff3eda..ce3b120 100644 (file)
@@ -220,9 +220,9 @@ Synopsis:
     my @oof = @bar;    # declare @oof lexical, and init it
     my $x : Foo = $y;  # similar, with an attribute applied
 
-B<WARNING>: The use of attribute lists on C<my> declarations is
-experimental.  This feature should not be relied upon.  It may
-change or disappear in future releases of Perl.  See L<attributes>.
+B<WARNING>: The use of attribute lists on C<my> declarations is still
+evolving.  The current semantics and interface are subject to change.
+See L<attributes> and L<Attribute::Handlers>.
 
 The C<my> operator declares the listed variables to be lexically
 confined to the enclosing block, conditional (C<if/unless/elsif/else>),
@@ -563,6 +563,13 @@ hash to some other implementation:
     }
     [..%ahash back to its initial tied self again..]
 
+B<WARNING> The code example above does not currently work as described.
+This will be fixed in a future release of Perl; in the meantime, avoid
+code that relies on any particular behaviour of localising tied arrays
+or hashes (localising individual elements is still okay).
+See L<perldelta/"Localising Tied Arrays and Hashes Is Broken"> for more
+details.
+
 As another example, a custom implementation of C<%ENV> might look
 like this:
 
@@ -615,14 +622,15 @@ types is subject to change in future.
 
 =head2 Lvalue subroutines
 
-B<WARNING>: Lvalue subroutines are still experimental and the implementation
-may change in future versions of Perl.
+B<WARNING>: Lvalue subroutines are still experimental and the
+implementation may change in future versions of Perl.
 
 It is possible to return a modifiable value from a subroutine.
 To do this, you have to declare the subroutine to return an lvalue.
 
     my $val;
     sub canmod : lvalue {
+       # return $val; this doesn't work, don't say "return"
        $val;
     }
     sub nomod {
@@ -648,6 +656,39 @@ and in:
 
 all the subroutines are called in a list context.
 
+=over 4
+
+=item Lvalue subroutines are EXPERIMENTAL
+
+They appear to be convenient, but there are several reasons to be
+circumspect.
+
+You can't use the return keyword, you must pass out the value before
+falling out of subroutine scope. (see comment in example above).  This
+is usually not a problem, but it disallows an explicit return out of a
+deeply nested loop, which is sometimes a nice way out.
+
+They violate encapsulation.  A normal mutator can check the supplied
+argument before setting the attribute it is protecting, an lvalue
+subroutine never gets that chance.  Consider;
+
+    my $some_array_ref = [];   # protected by mutators ??
+
+    sub set_arr {              # normal mutator
+       my $val = shift;
+       die("expected array, you supplied ", ref $val)
+          unless ref $val eq 'ARRAY';
+       $some_array_ref = $val;
+    }
+    sub set_arr_lv : lvalue {  # lvalue mutator
+       $some_array_ref;
+    }
+
+    # set_arr_lv cannot stop this !
+    set_arr_lv() = { a => 1 };
+
+=back
+
 =head2 Passing Symbol Table Entries (typeglobs)
 
 B<WARNING>: The mechanism described in this section was originally
@@ -1319,7 +1360,7 @@ parsed and invoked:
     use attributes __PACKAGE__, \&plugh, q[Ugly('\(")], 'Bad';
 
 For further details on attribute lists and their manipulation,
-see L<attributes>.
+see L<attributes> and L<Attribute::Handlers>.
 
 =head1 SEE ALSO