]> git.vpit.fr Git - perl/modules/Lexical-Types.git/commitdiff
Test and document constant as types
authorVincent Pit <vince@profvince.com>
Thu, 26 Feb 2009 17:26:37 +0000 (18:26 +0100)
committerVincent Pit <vince@profvince.com>
Thu, 26 Feb 2009 17:26:37 +0000 (18:26 +0100)
MANIFEST
Makefile.PL
lib/Lexical/Types.pm
t/14-constants.t [new file with mode: 0644]

index d556b6433b9c1b76207c6785cd870c98196b87e5..9c5b8f69dae147b3d8b57c6c489eac8d4f71ef38 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -11,6 +11,7 @@ t/10-args.t
 t/11-integrate.t
 t/12-padsv.t
 t/13-ro.t
+t/14-constants.t
 t/20-object.t
 t/21-tie.t
 t/22-magic.t
index 710fb1ea0e43cb03fc952460552b9c1bcfc76e04..f25d9e76a9910512d45017f3c5f197e86e988a3f 100644 (file)
@@ -13,6 +13,7 @@ my %META = (
  build_requires => {
   'ExtUtils::MakeMaker' => 0,
   'Test::More'          => 0,
+  'constant'            => 0,
  },
  resources => {
   bugtracker => "http://rt.cpan.org/NoAuth/ReportBug.html?Queue=$dist",
index f3ff14d7ade23e55bfa598346b63e65c6e51d65f..d97761b42b32272846695f77293d15cb5c95f4d2 100644 (file)
@@ -165,8 +165,21 @@ You can integrate L<Lexical::Types> in your module so that using it will provide
 
 =head1 CAVEATS
 
-For C<perl> to be able to parse C<my Str $x>, the package C<Str> must be defined somewhere, and this even if you use the C<'as'> option to redirect to another package.
-It's unlikely to find a workaround, as this happens deep inside the lexer, far from the reach of an extension.
+For C<perl> to be able to parse C<my Str $x>, you need :
+
+=over 4
+
+=item *
+
+either the C<Str> package to be defined ;
+
+=item *
+
+or for C<Str> to be a constant sub returning a valid defined package.
+
+=back
+
+Those restrictions 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.
 
@@ -202,6 +215,8 @@ Tests code coverage report is available at L<http://www.profvince.com/perl/cover
 
 Inspired by Ricardo Signes.
 
+Thanks Florian Ragwitz for suggesting the use of constants for types.
+
 =head1 COPYRIGHT & LICENSE
 
 Copyright 2009 Vincent Pit, all rights reserved.
diff --git a/t/14-constants.t b/t/14-constants.t
new file mode 100644 (file)
index 0000000..c4a550b
--- /dev/null
@@ -0,0 +1,36 @@
+#!perl -T
+
+use strict;
+use warnings;
+
+use Test::More tests => 6;
+
+use constant Str => 'MyTypes::Str';
+use constant Int => 'MyTypes::Int';
+use constant Num => 'MyTypes::Num';
+
+sub MyTypes::Str::new { "str:$_[0]" }
+
+sub MyTypes::Int::new { "int:$_[0]" }
+
+{ package MyTypes::Num }
+
+{
+ use Lexical::Types as => sub { $_[0] =~ /(?:Str|Int)/ ? ($_[0], 'new') : () };
+
+ my Str $x;
+ is $x, "str:MyTypes::Str", 'my constant_type $x';
+
+ my Int ($y, $z);
+ is $y, "int:MyTypes::Int", 'my constant_type ($y,';
+ is $z, "int:MyTypes::Int", 'my constant_type  $z)';
+
+ my Num $t;
+ is $t, undef, 'my constant_type_skipped $t';
+
+ my MyTypes::Str $u;
+ is $u, "str:MyTypes::Str", 'my MyTypes::Str $u';
+
+ my MyTypes::Num $v;
+ is $v, undef, 'my MyTypes::Num $v';
+}