X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FLexical%2FTypes.pm;h=841c3aad3393d64ab2117ba0b1e606479c4a1761;hb=ef454c52e92ecd149b3bf0f6e221162cad3955ac;hp=a7737515f0bcf8494db8b1fe6392937970ee710f;hpb=dd260203a528f4c8eb219708e2686f9a6fca228f;p=perl%2Fmodules%2FLexical-Types.git diff --git a/lib/Lexical/Types.pm b/lib/Lexical/Types.pm index a773751..841c3aa 100644 --- a/lib/Lexical/Types.pm +++ b/lib/Lexical/Types.pm @@ -13,30 +13,44 @@ Lexical::Types - Extend the semantics of typed lexicals. =head1 VERSION -Version 0.01 +Version 0.03 =cut our $VERSION; BEGIN { - $VERSION = '0.01'; + $VERSION = '0.03'; } =head1 SYNOPSIS + { package Str; } + + { + package My::Types::Str; + + sub new { bless { }, shift } + } + + use Lexical::Types as => sub { 'My::Types::' . $_[0] => 'new' }; + + my Str $x; # $x is now a My::Types::Str object + { - package Str; + package My::Types::Int; - sub TYPEDSCALAR { Some::String::Implementation->new } + sub TYPEDSCALAR { bless { }, shift } } use Lexical::Types; - my Str $x; # $x is now a Some::String::Implementation object + use constant Int => 'My::Types::Int'; + + my Int $y; # $y is now a My::Types::Int object =head1 DESCRIPTION -This module allows you to hook the execution of typed lexicals declarations (C). +This pragma 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. @@ -82,9 +96,9 @@ If the value given is a code reference C<$mangler>, it will be called at compile 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 + use Lexical::Types as => sub { return $_[0] =~ /Str/ ? @_ : () }; + my Str $y; # calls Str->TYPEDSCALAR + my Int $x; # nothing special =item * @@ -132,7 +146,7 @@ sub import { =head2 C Magically called when writing C. -Turns the module off. +Turns the pragma off. =cut @@ -165,8 +179,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<'as'> 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. @@ -202,6 +229,8 @@ Tests code coverage report is available at L