]> git.vpit.fr Git - perl/modules/Lexical-Types.git/blobdiff - lib/Lexical/Types.pm
Talk about $_[0] in 'as' callbacks for constant types
[perl/modules/Lexical-Types.git] / lib / Lexical / Types.pm
index 36960d88603cac0621c2a7620332192b8990c93a..c5bca1e792a0621ea31e10916e0c60f68476cf8d 100644 (file)
@@ -125,10 +125,15 @@ or the desired package and method name, in that order (if any of those is C<unde
 
 =back
 
-=back
+Note that if the type is a constant, C<$_[0]> will be set to the I<value> of constant and not to its name.
+
+    use Lexical::Types as => sub { $_[0] => 'new' };
+    use constant Str => 'MyStr';
+    my Str $x; # calls MyStr->new
+
+This means in particular that you can't both use constant types and redirect several types to different methods of the same package, because then you can't distinguish between the original types with C<$_[0]>.
 
-The initializer method receives an alias to the pad entry of C<$x> in C<$_[1]> and the original type name (C<Str>) in C<$_[2]>.
-You can either edit C<$_[1]> in place, in which case you should return an empty list, or return a new scalar that will be copied into C<$x>.
+=back
 
 =cut
 
@@ -170,6 +175,22 @@ sub unimport {
  $^H{+(__PACKAGE__)} = undef;
 }
 
+=head1 RUN-TIME INITIALIZER METHOD
+
+The initializer method receives an alias to the pad slot of the initialized lexical in C<$_[1]> and the original type name in C<$_[2]>.
+You can either edit C<$_[1]> in place, in which case you should return an empty list, or return a new scalar that will be copied into the pad slot.
+
+    use Lexical::Types as => 'My';
+
+    my Str $x;
+
+    ...
+
+    sub My::Str::TYPEDSCALAR {
+     # $_[1] is an alias to $x, and $_[2] is 'Str'
+     ...
+    }
+
 =head1 INTEGRATION
 
 You can integrate L<Lexical::Types> in your module so that using it will provide types to your users without asking them to load either L<Lexical::Types> or the type classes manually.