X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FTypes.pm;h=9e1cf94ebf654cefb6cf8da6a3effd8c84b4c833;hb=5885c4f4e1f234e7521f952bd1c1956395494c1e;hp=06b285f91c9bc02e399b9f2e3bc15abad3e0f506;hpb=686e58885d32547acf17d5d66b8ca5836a9af584;p=gitmo%2FMooseX-Types.git diff --git a/lib/MooseX/Types.pm b/lib/MooseX/Types.pm index 06b285f..9e1cf94 100644 --- a/lib/MooseX/Types.pm +++ b/lib/MooseX/Types.pm @@ -19,8 +19,8 @@ use Carp::Clan qw( ^MooseX::Types ); use namespace::clean -except => [qw( meta )]; -our $VERSION = 0.06; - +use 5.008; +our $VERSION = 0.09; my $UndefMsg = q{Action for type '%s' not yet defined in library '%s'}; =head1 SYNOPSIS @@ -40,7 +40,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 +263,21 @@ The fully qualified name of this type as L 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 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 uses L to do some overloading @@ -280,7 +295,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 +372,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 +398,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 +497,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 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