Lexical::Types - Extend the semantics of typed lexicals.
VERSION
- Version 0.06
+ Version 0.15
SYNOPSIS
{ package Str; }
This pragma is not implemented with a source filter.
-FUNCTIONS
- "import [ as => [ $prefix | $mangler ] ]"
- Magically called when writing "use Lexical::Types". All the occurences
- of "my Str $x" in the current lexical scope will be changed to call at
- each run a given method in a given package. The method and package are
- determined by the parameter 'as' :
+METHODS
+ "import"
+ use Lexical::Types;
+ use Lexical::Types as => $prefix;
+ use Lexical::Types as => sub { ... }; # = $mangler
+
+ Magically called when "use Lexical::Types" is encountered. All the
+ occurences of "my Str $x" in the current lexical scope will be changed
+ to call at each run a given method in a given package. The method and
+ package are determined by the parameter 'as' :
* If it's left unspecified, the "TYPEDSCALAR" method in the "Str"
package will be called.
definition will be skipped (thus it won't be altered to trigger
a run-time hook) ;
- use Lexical::Types as => sub { return $_[0] =~ /Str/ ? @_ : () };
+ use Lexical::Types as => sub {
+ return $_[0] =~ /Str/ ? @_ : ()
+ };
my Str $y; # calls Str->TYPEDSCALAR
my Int $x; # nothing special
$_[0].
"unimport"
- Magically called when writing "no Lexical::Types". Turns the pragma off.
+ no Lexical::Types;
+
+ Magically called when "no Lexical::Types" is encountered. Turns the
+ pragma off.
RUN-TIME INITIALIZER METHOD
The initializer method receives an alias to the pad slot of the
sub import {
my $pkg = caller;
- for (qw/Str Int/) {
+ for (qw<Str Int>) {
my $type = __PACKAGE__ . '::' . $_;
no strict 'refs';
no warnings 'redefine';
CONSTANTS
"LT_THREADSAFE"
- True iff the module could have been built when thread-safety features.
+ True iff the module could have been built with thread-safety features
+ enabled.
+
+ "LT_FORKSAFE"
+ 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 .
CAVEATS
+ Using this pragma will cause a slight global slowdown of any subsequent
+ compilation phase that happens anywere in your code - even outside of
+ the scope of use of "use Lexical::Types" - which may become noticeable
+ if you rely heavily on numerous calls to "eval STRING".
+
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
Only one mangler or prefix can be in use at the same time in a given
scope.
+ Typed lexicals declarations that appear in code "eval"'d during the
+ global destruction phase of a spawned thread or pseudo-fork (the
+ processes used internally for the "fork" emulation on Windows) are
+ ignored.
+
+ The implementation was tweaked to work around several limitations of
+ vanilla "perl" pragmas : it's thread safe, and doesn't suffer from a
+ "perl 5.8.x-5.10.0" bug that causes all pragmas to propagate into
+ "require"d scopes.
+
+ With 5.8 perls, the pragma does not propagate into "eval STRING". This
+ is due to a shortcoming in the way perl handles the hints hash, which is
+ addressed in perl 5.10.
+
DEPENDENCIES
- perl 5.8, XSLoader.
+ perl 5.8.4.
+
+ 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.
+
+ XSLoader (standard since perl 5.6.0).
SEE ALSO
fields.
perldoc Lexical::Types
- Tests code coverage report is available at
- <http://www.profvince.com/perl/cover/Lexical-Types>.
-
ACKNOWLEDGEMENTS
Inspired by Ricardo Signes.
Thanks Florian Ragwitz for suggesting the use of constants for types.
COPYRIGHT & LICENSE
- Copyright 2009 Vincent Pit, all rights reserved.
+ Copyright 2009,2010,2011,2012,2013,2014,2015 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.