X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FLexical%2FTypes.pm;h=112c04236baa6956ca9fe48215b7e82f33178e1f;hb=418197898e73f85448f28aa1236f205f6a3cff5d;hp=c5bca1e792a0621ea31e10916e0c60f68476cf8d;hpb=7a753d187ec273e873d5d8a8afb9e48fed7d1955;p=perl%2Fmodules%2FLexical-Types.git diff --git a/lib/Lexical/Types.pm b/lib/Lexical/Types.pm index c5bca1e..112c042 100644 --- a/lib/Lexical/Types.pm +++ b/lib/Lexical/Types.pm @@ -13,13 +13,13 @@ Lexical::Types - Extend the semantics of typed lexicals. =head1 VERSION -Version 0.03 +Version 0.07 =cut our $VERSION; BEGIN { - $VERSION = '0.03'; + $VERSION = '0.07'; } =head1 SYNOPSIS @@ -155,7 +155,7 @@ sub import { croak "Invalid $r reference for 'as'"; } } else { - $hint = _tag(0); + $hint = _tag(sub { @_ }); } $^H |= 0x020000; @@ -214,26 +214,54 @@ 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.