X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FLexical-Types.git;a=blobdiff_plain;f=lib%2FLexical%2FTypes.pm;h=ae17a75cd15980b6fdf9a532273b8cbab133d9ad;hp=c5c416b97f53da70db2d906db7fd4c91f8d11059;hb=005b1303d3fd36462b38b097f8c4f5abc7aa8369;hpb=cd8d951930816a806c3c5913fdea42dce49cc581 diff --git a/lib/Lexical/Types.pm b/lib/Lexical/Types.pm index c5c416b..ae17a75 100644 --- a/lib/Lexical/Types.pm +++ b/lib/Lexical/Types.pm @@ -1,25 +1,23 @@ package Lexical::Types; -use 5.008; +use 5.008003; use strict; use warnings; -use Carp qw/croak/; - =head1 NAME Lexical::Types - Extend the semantics of typed lexicals. =head1 VERSION -Version 0.03 +Version 0.12 =cut our $VERSION; BEGIN { - $VERSION = '0.03'; + $VERSION = '0.12'; } =head1 SYNOPSIS @@ -125,6 +123,14 @@ or the desired package and method name, in that order (if any of those is C will be set to the I 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]>. + =back =cut @@ -144,10 +150,11 @@ sub import { $as .= '::' if $as !~ /::$/; $hint = _tag(sub { $as . $_[0] }); } else { - croak "Invalid $r reference for 'as'"; + require Carp; + Carp::croak("Invalid $r reference for 'as'"); } } else { - $hint = _tag(0); + $hint = _tag(sub { @_ }); } $^H |= 0x020000; @@ -206,29 +213,67 @@ 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) { + 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. + +=head2 C + +True iff this module could have been built with fork-safety features enabled. +This will always be true except on Windows where it's false for perl 5.10.0 and below . + +=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.3. + +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 @@ -244,7 +289,8 @@ You can contact me by mail or on C (vincent). =head1 BUGS -Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. +Please report any bugs or feature requests to C, or through the web interface at L. +I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. =head1 SUPPORT @@ -262,7 +308,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,2011 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.