From: Vincent Pit Date: Sat, 7 Mar 2009 15:44:20 +0000 (+0100) Subject: This is 0.04 X-Git-Tag: v0.04^0 X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FLexical-Types.git;a=commitdiff_plain;h=e969ec4cc563f70e92f4428bfc01528de9b8ceb9 This is 0.04 --- diff --git a/Changes b/Changes index 14ab9e1..90a0e69 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,12 @@ Revision history for Lexical-Types +0.04 2009-03-07 15:45 UTC + + Chg : Some implementation of pointer table is now used internally. + This should make thread safety more robust. + + Doc : Cleanups. + + Tst : Using Lexical::Types inside the 'as' callback. + + Tst : Thread safety. + 0.03 2009-03-05 21:15 UTC + Doc : Discuss about using constants for types. + Fix : The PL_ppaddr[OP_PADSV] localization logic was refined so that diff --git a/META.yml b/META.yml index 72b23ff..807e6bb 100644 --- a/META.yml +++ b/META.yml @@ -1,6 +1,6 @@ --- #YAML:1.0 name: Lexical-Types -version: 0.03 +version: 0.04 abstract: Extend the semantics of typed lexicals. author: - Vincent Pit diff --git a/README b/README index bba2ba0..0d8a7a8 100644 --- a/README +++ b/README @@ -2,7 +2,7 @@ NAME Lexical::Types - Extend the semantics of typed lexicals. VERSION - Version 0.03 + Version 0.04 SYNOPSIS { package Str; } @@ -31,10 +31,20 @@ SYNOPSIS DESCRIPTION This pragma allows you to hook the execution of typed lexicals - declarations ("my Str $x"). In particular, it can be used to - automatically tie or bless typed lexicals. + declarations ("my Str $x") by calling a configurable method in a + configurable package at each run. In particular, it can be used to + automatically tie or bless typed lexicals whenever they are initialized. - It is not implemented with a source filter. + Remind that for "perl" to be able to parse "my Str $x", you need : + + * either the "Str" package to be defined ; + + * or for "Str" to be a constant sub returning a valid defined package. + + so make sure you follow one of those two strategies to define your + types. + + This pragma is not implemented with a source filter. FUNCTIONS "import [ as => [ $prefix | $mangler ] ]" @@ -73,14 +83,38 @@ FUNCTIONS use Lexical::Types as => sub { 'My', 'new_' . lc($_[0]) }; my Str $x; # the coderef indicates to call My->new_str - The initializer method receives an alias to the pad entry of $x in $_[1] - and the original type name ("Str") in $_[2]. You can either edit $_[1] - in place, in which case you should return an empty list, or return a new - scalar that will be copied into $x. + Note that if the type is a constant, $_[0] will be set to the + *value* 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 + $_[0]. "unimport" Magically called when writing "no Lexical::Types". Turns the pragma off. +RUN-TIME INITIALIZER METHOD + The initializer method receives an alias to the pad slot of the + initialized lexical in $_[1] and the original type name in $_[2]. You + can either edit $_[1] in place, in which case you should return an empty + list, or return a new scalar that will be copied into the pad slot. + + use Lexical::Types as => 'My'; + + my Str $x; + + ... + + sub My::Str::TYPEDSCALAR { + # $_[1] is an alias to $x, and $_[2] is 'Str' + ... + } + INTEGRATION You can integrate Lexical::Types in your module so that using it will provide types to your users without asking them to load either @@ -105,6 +139,38 @@ INTEGRATION sub new_int { ... } + If you prefer to use constants rather than creating empty packages, you + can replace the previous example with something like this : + + package MyTypes; + + BEGIN { require Lexical::Types; } + + 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' } + ); + } + + sub unimport { + Lexical::Types->unimport; + } + + package MyTypes::Str; + + sub new { ... } + + package MyTypes::Int; + + sub new { ... } + CAVEATS For "perl" to be able to parse "my Str $x", you need : @@ -112,9 +178,10 @@ CAVEATS * or for "Str" to be a constant sub returning a valid defined package. - Those restrictions apply even if you use the '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. + The restrictions on the type (being either a defined package name or a + constant) apply even if you use the '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. diff --git a/lib/Lexical/Types.pm b/lib/Lexical/Types.pm index be4d71c..e935d38 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.04 =cut our $VERSION; BEGIN { - $VERSION = '0.03'; + $VERSION = '0.04'; } =head1 SYNOPSIS