removed the Data::Dump debugging code
[gitmo/MooseX-Types.git] / lib / MooseX / Types.pm
index 06b285f..4a39855 100644 (file)
@@ -7,9 +7,6 @@ MooseX::Types - Organise your Moose types in libraries
 
 =cut
 
-#use warnings;
-#use strict;
-
 use Moose::Util::TypeConstraints;
 use MooseX::Types::TypeDecorator;
 use MooseX::Types::Base             ();
@@ -19,8 +16,8 @@ use Carp::Clan                      qw( ^MooseX::Types );
 
 use namespace::clean -except => [qw( meta )];
 
-our $VERSION = 0.06;
-
+use 5.008;
+our $VERSION = 0.10;
 my $UndefMsg = q{Action for type '%s' not yet defined in library '%s'};
 
 =head1 SYNOPSIS
@@ -40,7 +37,7 @@ my $UndefMsg = q{Action for type '%s' not yet defined in library '%s'};
   # import builtin types
   use MooseX::Types::Moose 'Int';
 
-  # type definition
+  # type definition.
   subtype PositiveInt, 
       as Int, 
       where { $_ > 0 },
@@ -263,6 +260,21 @@ The fully qualified name of this type as L<Moose> knows it.
 A message that will be thrown when type functionality is used but the
 type does not yet exist.
 
+=head1 RECURSIVE SUBTYPES
+
+As of version 0.08, L<Moose::Types> has experimental support for Recursive
+subtypes.  This will allow:
+
+    subtype Tree() => as HashRef[Str|Tree];
+
+Which validates things like:
+
+    {key=>'value'};
+    {key=>{subkey1=>'value', subkey2=>'value'}}
+    
+And so on.  This feature is new and there may be lurking bugs so don't be afraid
+to hunt me down with patches and test cases if you have trouble.
+
 =head1 NOTES REGARDING TYPE UNIONS
 
 L<MooseX::Types> uses L<MooseX::Types::TypeDecorator> to do some overloading
@@ -280,7 +292,7 @@ types you define in a type library.
     has 'attr' => (isa=>HashRef|Int);
 
 And everything should just work as you'd think.
-    
+
 =head1 METHODS
 
 =head2 import
@@ -357,6 +369,7 @@ sub type_export_generator {
         } else {
             $type_constraint = $class->create_base_type_constraint($name);
         }
+
         $type_constraint = defined($type_constraint) ? $type_constraint
          : MooseX::Types::UndefinedType->new($name);
          
@@ -382,8 +395,8 @@ it with @args.
 =cut
 
 sub create_arged_type_constraint {
-    my ($class, $name, @args) = @_;
-    my $type_constraint = Moose::Util::TypeConstraints::find_or_create_type_constraint($name);
+    my ($class, $name, @args) = @_;  
+    my $type_constraint = Moose::Util::TypeConstraints::find_or_create_type_constraint("$name");
        return $type_constraint->parameterize(@args);
 }
 
@@ -481,6 +494,42 @@ documention and examples nearly uniformly use the '=>' version of the comma
 operator and this could be an issue if you are converting code.
 
 Patches welcome for discussion.
+
+=head2 Compatibility with Sub::Exporter
+
+If you want to use L<Sub::Exporter> with a Type Library, you need to make sure
+you export all the type constraints declared AS WELL AS any additional export
+targets. For example if you do:
+
+    package TypeAndSubExporter; {
+        
+        use MooseX::Types::Moose qw(Str);
+        use MooseX::Types -declare => [qw(MyStr)];
+        use Sub::Exporter -setup => { exports => [ qw(something) ] };
+        
+        subtype MyStr,
+         as Str;
+         
+        sub something {
+            return 1;
+        }    
+        
+    } 1;
+    
+    package Foo; {
+        use TypeAndSubExporter qw(MyStr);
+    } 1;
+
+You'll get a '"MyStr" is not exported by the TypeAndSubExporter module' error.
+Upi can workaround by:
+
+        - use Sub::Exporter -setup => { exports => [ qw(something) ] };
+        + use Sub::Exporter -setup => { exports => [ qw(something MyStr) ] };
+
+This is a workaround and I am exploring how to make these modules work better
+together.  I realize this workaround will lead a lot of duplication in your
+export declarations and will be onerous for large type libraries.  Patches and
+detailed test cases welcome. See the tests directory for a start on this.
     
 =head1 SEE ALSO