X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FLexical%2FTypes.pm;h=d97761b42b32272846695f77293d15cb5c95f4d2;hb=99dd805ff2026836a638c45fed6ecd4d4d483833;hp=4eed8beb189f610fbf8b54f62b5d3a1e52bd4f8b;hpb=06cb3f3506161a118dc440264dcabcd612b9432c;p=perl%2Fmodules%2FLexical-Types.git diff --git a/lib/Lexical/Types.pm b/lib/Lexical/Types.pm index 4eed8be..d97761b 100644 --- a/lib/Lexical/Types.pm +++ b/lib/Lexical/Types.pm @@ -1,5 +1,7 @@ package Lexical::Types; +use 5.008; + use strict; use warnings; @@ -11,13 +13,13 @@ Lexical::Types - Extend the semantics of typed lexicals. =head1 VERSION -Version 0.01 +Version 0.02 =cut our $VERSION; BEGIN { - $VERSION = '0.01'; + $VERSION = '0.02'; } =head1 SYNOPSIS @@ -34,7 +36,7 @@ BEGIN { =head1 DESCRIPTION -This module allows you to hook the execution of typed lexicals declarations (C). +This module allows you to hook the execution of typed lexicals declarations (C). In particular, it can be used to automatically tie or bless typed lexicals. It is B implemented with a source filter. @@ -51,36 +53,51 @@ BEGIN { =head2 C<< import [ as => [ $prefix | $mangler ] ] >> Magically called when writing C. -All the occurences of C in the current lexical scope will be changed to call at each run a given method in a given package. -The method and package are determined by the parameter C : +All the occurences of C in the current lexical scope will be changed to call at each run a given method in a given package. +The method and package are determined by the parameter C<'as'> : =over 4 =item * -If it's left unspecified, the C method in the C package will be called. +If it's left unspecified, the C method in the C package will be called. use Lexical::Types; my Str $x; # calls Str->TYPEDSCALAR =item * -If a plain scalar C<$prefix> is passed as the value, the C method in the C<${prefix}::Foo> package will be used. +If a plain scalar C<$prefix> is passed as the value, the C method in the C<${prefix}::Str> package will be used. use Lexical::Types as => 'My::'; # or "as => 'My'" my Str $x; # calls My::Str->TYPEDSCALAR =item * -If the value given is a code reference C<$mangler>, it will be called at compile-time with arguments C<'Foo'> and C<'TYPEDSCALAR'> and is expected to return the desired package and method name (in that order). -If any of those is C, the default value will be used instead. +If the value given is a code reference C<$mangler>, it will be called at compile-time with arguments C<'Str'> and C<'TYPEDSCALAR'> and is expected to return : + +=over 4 + +=item * + +either an empty list, in which case the current typed lexical definition will be skipped (thus it won't be altered to trigger a run-time hook) ; + + use Lexical::Types as => sub { return $_[0] =~ /Str/ ? () : @_ }; + my Str $x; # nothing special + my Int $y; # calls Int->TYPEDSCALAR + +=item * + +or the desired package and method name, in that order (if any of those is C, the default value will be used instead). use Lexical::Types as => sub { 'My', 'new_' . lc($_[0]) }; my Str $x; # the coderef indicates to call My->new_str =back -The initializer method receives an alias to the pad entry of C<$x> in C<$_[1]> and the original type name (C) in C<$_[2]>. +=back + +The initializer method receives an alias to the pad entry of C<$x> in C<$_[1]> and the original type name (C) 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>. =cut @@ -148,8 +165,21 @@ You can integrate L in your module so that using it will provide =head1 CAVEATS -For C to be able to parse C, the package C must be defined somewhere, and this even if you use the C option to redirect to another package. -It's unlikely to find a workaround, as this happens deep inside the lexer, far from the reach of an extension. +For C to be able to parse C, you need : + +=over 4 + +=item * + +either the C package to be defined ; + +=item * + +or for C to be a constant sub returning a valid defined package. + +=back + +Those restrictions apply even if you use the C<'as'> option to redirect to another package, and are unlikely to find a workaround as this happens deep inside the lexer - far from the reach of an extension. Only one mangler or prefix can be in use at the same time in a given scope. @@ -179,10 +209,14 @@ You can find documentation for this module with the perldoc command. perldoc Lexical::Types +Tests code coverage report is available at L. + =head1 ACKNOWLEDGEMENTS Inspired by Ricardo Signes. +Thanks Florian Ragwitz for suggesting the use of constants for types. + =head1 COPYRIGHT & LICENSE Copyright 2009 Vincent Pit, all rights reserved.