=head1 VERSION
-Version 0.03
+Version 0.05
=cut
our $VERSION;
BEGIN {
- $VERSION = '0.03';
+ $VERSION = '0.05';
}
=head1 SYNOPSIS
=back
+Note that if the type is a constant, C<$_[0]> will be set to the I<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 C<$_[0]>.
+
=back
=cut
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<perl> to be able to parse C<my Str $x>, 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<Str> package to be defined ;
+ sub unimport {
+ Lexical::Types->unimport;
+ }
-=item *
+ package MyTypes::Str;
-or for C<Str> to be a constant sub returning a valid defined package.
+ sub new { ... }
-=back
+ package MyTypes::Int;
+
+ sub new { ... }
+
+=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.