adding another example and some docs
Stevan Little [Mon, 21 Sep 2009 04:08:25 +0000 (00:08 -0400)]
lib/Moose/Util/TypeConstraints.pm
t/040_type_constraints/036_match_type_operator.t

index b5ff3f7..2341102 100644 (file)
@@ -1150,11 +1150,30 @@ Perl pretty printer dispatching over the core Moose types.
                     => sub { die "I don't know what $_ is"             };
   }
 
+Or a simple JSON serializer:
+
+  sub to_json {
+      my $x = shift;
+      match_on_type $x =>
+          HashRef   => sub {
+              my $hash = shift;
+              '{ ' . (join ", " => map {
+                          '"' . $_ . '" : ' . to_json( $hash->{ $_ } )
+                      } sort keys %$hash ) . ' }'                         },
+          ArrayRef  => sub {
+              my $array = shift;
+              '[ ' . (join ", " => map { to_json( $_ ) } @$array ) . ' ]' },
+          Num       => sub { $_                                           },
+          Str       => sub { '"'. $_ . '"'                                },
+          Undef     => sub { 'null'                                       },
+                    => sub { die "$_ is not acceptable json type"         };
+  }
+
 Based on a mapping of C<$type> to C<\&action>, where C<$type> can be
 either a string type or a L<Moose::Meta::TypeConstraint> object, and
 C<\&action> is a CODE ref, this function will dispatch on the first
 match for C<$value>. It is possible to have a catch-all at the end
-in the form of a C<\&default> CODE ref
+in the form of a C<\&default> CODE ref.
 
 =back
 
index 3728ea8..f5fa5ad 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 23;
+use Test::More tests => 25;
 use Test::Exception;
 
 use Moose::Util::TypeConstraints;
@@ -174,6 +174,42 @@ is(
     '... got the right pretty printed values'
 );
 
+# simple JSON serializer
+
+sub to_json {
+    my $x = shift;
+    match_on_type $x =>
+        HashRef   => sub {
+            my $hash = shift;
+            '{ ' . (join ", " => map {
+                        '"' . $_ . '" : ' . to_json( $hash->{ $_ } )
+                    } sort keys %$hash ) . ' }'                         },
+        ArrayRef  => sub {
+            my $array = shift;
+            '[ ' . (join ", " => map { to_json( $_ ) } @$array ) . ' ]' },
+        Num       => sub { $_                                           },
+        Str       => sub { '"'. $_ . '"'                                },
+        Undef     => sub { 'null'                                       },
+                  => sub { die "$_ is not acceptable json type"         };
+}
+
+is(
+    to_json( { one => 1, two => 2 } ),
+    '{ "one" : 1, "two" : 2 }',
+    '... got our valid JSON'
+);
+
+is(
+    to_json( {
+        one   => [ 1, 2, 3, 4 ],
+        two   => undef,
+        three => "Hello World"
+    } ),
+    '{ "one" : [ 1, 2, 3, 4 ], "three" : "Hello World", "two" : null }',
+    '... got our valid JSON'
+);
+
+
 # some error cases
 
 sub not_enough_matches {