X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FLexical%2FTypes.pm;h=051a410143835a8f7ce9330b9b8ce1d50551c3e0;hb=57acb768d1de8e0579f81db777ca25834e39644b;hp=c5bca1e792a0621ea31e10916e0c60f68476cf8d;hpb=7a753d187ec273e873d5d8a8afb9e48fed7d1955;p=perl%2Fmodules%2FLexical-Types.git diff --git a/lib/Lexical/Types.pm b/lib/Lexical/Types.pm index c5bca1e..051a410 100644 --- a/lib/Lexical/Types.pm +++ b/lib/Lexical/Types.pm @@ -1,6 +1,6 @@ package Lexical::Types; -use 5.008; +use 5.008001; use strict; use warnings; @@ -13,13 +13,13 @@ Lexical::Types - Extend the semantics of typed lexicals. =head1 VERSION -Version 0.03 +Version 0.09 =cut our $VERSION; BEGIN { - $VERSION = '0.03'; + $VERSION = '0.09'; } =head1 SYNOPSIS @@ -155,7 +155,7 @@ sub import { croak "Invalid $r reference for 'as'"; } } else { - $hint = _tag(0); + $hint = _tag(sub { @_ }); } $^H |= 0x020000; @@ -214,29 +214,62 @@ You can integrate L in your module so that using it will provide sub new_int { ... } -=head1 CAVEATS +If you prefer to use constants rather than creating empty packages, you can replace the previous example with something like this : -For C to be able to parse C, you need : + package MyTypes; -=over 4 + BEGIN { require Lexical::Types; } -=item * + sub import { + my $pkg = caller; + for (qw/Str Int/) { + my $type = __PACKAGE__ . '::' . $_; + no strict 'refs'; + no warnings 'redefine'; + *{$pkg.'::'.$_} = eval "sub () { '$type' }"; + } + Lexical::Types->import( + as => sub { $_[0] => 'new' } + ); + } -either the C package to be defined ; + sub unimport { + Lexical::Types->unimport; + } -=item * + package MyTypes::Str; -or for C to be a constant sub returning a valid defined package. + sub new { ... } -=back + package MyTypes::Int; + + sub new { ... } + +=head1 CONSTANTS + +=head2 C + +True iff the module could have been built with thread-safety features enabled. + +=head1 CAVEATS The restrictions on the type (being either a defined package name or a constant) 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. +The implementation was tweaked to work around several limitations of vanilla C pragmas : it's thread safe, and doesn't suffer from a C bug that causes all pragmas to propagate into Cd scopes. + +With 5.8 perls, the pragma does not propagate into C. +This is due to a shortcoming in the way perl handles the hints hash, which is addressed in perl 5.10. + =head1 DEPENDENCIES -L 5.8, L. +L 5.8.1. + +A C compiler. +This module may happen to build with a C++ compiler as well, but don't rely on it, as no guarantee is made in this regard. + +L (standard since perl 5.006). =head1 SEE ALSO @@ -270,7 +303,7 @@ Thanks Florian Ragwitz for suggesting the use of constants for types. =head1 COPYRIGHT & LICENSE -Copyright 2009 Vincent Pit, all rights reserved. +Copyright 2009,2010 Vincent Pit, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.