Tidy up XS Type Constraints
Scott McWhirter [Wed, 20 Feb 2008 03:05:20 +0000 (03:05 +0000)]
  - Add Undef and Defined XS constraints
  - Make XS keep single reference to "Regexp"
  - Remove old optimized versions

Moose.xs
lib/Moose/Util/TypeConstraints.pm
lib/Moose/Util/TypeConstraints/OptimizedConstraints.pm

index 2da4749..ef7a8d9 100644 (file)
--- a/Moose.xs
+++ b/Moose.xs
@@ -31,13 +31,13 @@ ck_sv_ref_type(SV* value, int sv_type){
   return retval;
 }
 
+static const char *regclass = "Regexp";
 
 MODULE = Moose PACKAGE = Moose::Util::TypeConstraints::OptimizedConstraints
 PROTOTYPES: ENABLE
 
-#ifdef HEHEHOHOHAHA
 bool
-Undefined(value)
+Undef(value)
   SV* value
   CODE:
     RETVAL = !ck_sv_defined(value);
@@ -52,8 +52,6 @@ Defined(value)
   OUTPUT:
     RETVAL
 
-#endif
-
 bool
 Value(value)
   SV* value
@@ -134,8 +132,6 @@ GlobRef(value)
 bool
 Object(value)
   SV* value
-  PREINIT:
-    char *regclass = "Regexp";
   CODE:
     RETVAL = 0;
     if( ck_sv_is_ref(value) 
@@ -150,8 +146,6 @@ Object(value)
 bool
 RegexpRef(value)
   SV* value
-  PREINIT:
-    char *regclass = "Regexp";
   CODE:
     RETVAL = 0;
     if( ck_sv_is_ref(value)
index 171a28a..18a0f43 100644 (file)
@@ -401,8 +401,15 @@ sub _install_type_coercions ($$) {
 type 'Any'  => where { 1 }; # meta-type including all
 type 'Item' => where { 1 }; # base-type
 
-subtype 'Undef'   => as 'Item' => where { !defined($_) };
-subtype 'Defined' => as 'Item' => where {  defined($_) };
+subtype 'Undef'   
+    => as 'Item' 
+    => where { !defined($_) }
+    => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Undef;
+
+subtype 'Defined' 
+    => as 'Item' 
+    => where {  defined($_) }
+    => optimize_as \&Moose::Util::TypeConstraints::OptimizedConstraints::Defined;
 
 subtype 'Bool'
     => as 'Item'
index f968392..80e13b7 100644 (file)
@@ -9,38 +9,17 @@ our $VERSION   = '0.02';
 our $AUTHORITY = 'cpan:STEVAN';
 
 use XSLoader;
-XSLoader::load('Moose', '0.39');
+# Optimized type constraints are XS in Moose.xs
+XSLoader::load('Moose', '0.39'); # This is a pain... must use the version number of moose
+                                 # but can't refer to it since Moose may not be loaded.
 
-#sub Value { defined($_[0]) && !ref($_[0]) }
+sub Num         { !ref($_[0]) && looks_like_number($_[0]) }
 
-#sub Ref { ref($_[0]) }
+sub Int         { defined($_[0]) && !ref($_[0]) && $_[0] =~ /^-?[0-9]+$/ }
 
-#sub Str { defined($_[0]) && !ref($_[0]) }
+sub FileHandle  { ref($_[0]) eq 'GLOB' && Scalar::Util::openhandle($_[0]) or blessed($_[0]) && $_[0]->isa("IO::Handle") }
 
-sub Num { !ref($_[0]) && looks_like_number($_[0]) }
-
-sub Int { defined($_[0]) && !ref($_[0]) && $_[0] =~ /^-?[0-9]+$/ }
-
-{
-    no warnings 'uninitialized';
-#    sub ScalarRef { ref($_[0]) eq 'SCALAR' }
-#    sub ArrayRef  { ref($_[0]) eq 'ARRAY'  }
-#    sub HashRef   { ref($_[0]) eq 'HASH'   }
-#    sub CodeRef   { ref($_[0]) eq 'CODE'   }
-#    sub RegexpRef { ref($_[0]) eq 'Regexp' }
-#    sub GlobRef   { ref($_[0]) eq 'GLOB'   }
-}
-
-sub FileHandle { ref($_[0]) eq 'GLOB' && Scalar::Util::openhandle($_[0]) or blessed($_[0]) && $_[0]->isa("IO::Handle") }
-
-#sub Object { blessed($_[0]) && blessed($_[0]) ne 'Regexp' }
-
-sub Role { blessed($_[0]) && $_[0]->can('does') }
-
-# NOTE:
-# we have XS versions too, ...
-# 04:09 <@konobi> nothingmuch: konobi.co.uk/code/utilsxs.tar.gz
-# 04:09 <@konobi> or utilxs.tar.gz iirc
+sub Role        { blessed($_[0]) && $_[0]->can('does') }
 
 1;
 
@@ -61,6 +40,10 @@ This file contains the hand optimized versions of Moose type constraints.
 
 =over 4
 
+=item Undef
+
+=item Defined
+
 =item Value
 
 =item Ref
@@ -100,6 +83,7 @@ to cpan-RT.
 =head1 AUTHOR
 
 Yuval Kogman E<lt>nothingmuch@cpan.orgE<gt>
+Konobi E<lt>konobi@cpan.orgE<gt>
 
 =head1 COPYRIGHT AND LICENSE