Author: lwall Date: 2010-03-07 15:42:59 +0100 (Sun, 07 Mar 2010) New Revision: 29976
Modified: docs/Perl6/Spec/S06-routines.pod docs/Perl6/Spec/S12-objects.pod Log: [S06,S12] make attributive parameters default to 'is copy' binding make easy way for an attribute to override this with 'is ref' Modified: docs/Perl6/Spec/S06-routines.pod =================================================================== --- docs/Perl6/Spec/S06-routines.pod 2010-03-07 13:53:10 UTC (rev 29975) +++ docs/Perl6/Spec/S06-routines.pod 2010-03-07 14:42:59 UTC (rev 29976) @@ -16,8 +16,8 @@ Created: 21 Mar 2003 - Last Modified: 9 Feb 2010 - Version: 128 + Last Modified: 7 Mar 2010 + Version: 129 This document summarizes Apocalypse 6, which covers subroutines and the new type system. @@ -1543,7 +1543,7 @@ submethod initialize($.name, $!age) {} -then the argument is assigned directly to the object's attribute of the +then the argument is bound directly to the object's attribute of the same name. This avoids the frequent need to write code like: submethod initialize($name, $age) { @@ -1551,6 +1551,22 @@ $!age = $age; } +The initialization of attributes requires special care to preserve +encapsulation; therefore the default for attributive parameters is +value semantics, that is, as if specified with C<is copy>. Hence, +the submethod above is really more like: + + submethod initialize($name is copy, $age is copy) { + $.name := $name; # or maybe = here, since it's a parent's attr + $!age := $age; # or maybe only $! parameters work really + } + +If you wish to allow the user to initialize an attribute by reference, +you may either write your own initializer submethod explicitly, or +simply mark the attributes you want to work that way with C<is ref>: + + has $!age is ref; # BUILD will automatically use ref binding, not copy + To rename an attribute parameter you can use the explicit pair form: submethod initialize(:moniker($.name), :youth($!age)) {} Modified: docs/Perl6/Spec/S12-objects.pod =================================================================== --- docs/Perl6/Spec/S12-objects.pod 2010-03-07 13:53:10 UTC (rev 29975) +++ docs/Perl6/Spec/S12-objects.pod 2010-03-07 14:42:59 UTC (rev 29976) @@ -13,8 +13,8 @@ Created: 27 Oct 2004 - Last Modified: 24 Jan 2010 - Version: 98 + Last Modified: 7 Mar 2010 + Version: 99 =head1 Overview @@ -796,9 +796,9 @@ is equivalent to - submethod BUILD ($tail, $legs) { - $!tail = $tail; - $!legs = $legs; + submethod BUILD ($tail is copy, $legs is copy) { + $!tail := $tail; + $!legs := $legs; } Whether you write your own C<BUILD> or not, at the end of the C<BUILD>,