Mangle the request class mangling stuff. It's still fugly, but it's no longer totally...
Tomas Doran [Fri, 11 Dec 2009 02:50:39 +0000 (02:50 +0000)]
Makefile.PL
lib/Catalyst/Request/REST.pm
t/catalyst-request-rest.t

index dc2b9e5..98b9f2c 100644 (file)
@@ -5,7 +5,9 @@ perl_version '5.8.1';
 name 'Catalyst-Action-REST';
 all_from 'lib/Catalyst/Action/REST.pm';
 
-requires('Catalyst::Runtime'         => '5.7001');
+requires 'Moose';
+requires 'namespace::autoclean';
+requires('Catalyst::Runtime'         => '5.80');
 requires('Params::Validate'          => '0.76');
 requires('YAML::Syck'                => '0.67');
 requires('Module::Pluggable::Object' => undef);
@@ -15,8 +17,8 @@ requires('Class::Inspector'          => '1.13');
 requires('URI::Find'                 => undef);
 requires('MRO::Compat'               => '0.10');
 
-requires 'Moose';
 requires 'namespace::autoclean';
+test_requires 'Test::More' => '0.88';
 
 feature 'JSON (application/json) support',
     -default   => 0,
index b9b921b..ba60659 100644 (file)
@@ -16,11 +16,19 @@ sub _insert_self_into {
 
   my $req_class = $app->request_class;
   return if $req_class->isa($class);
+  my $req_class_meta = Moose->init_meta( for_class => $req_class );
+  return if $req_class_meta->does_role('Catalyst::TraitFor::Request::REST');
   if ($req_class eq 'Catalyst::Request') {
     $app->request_class($class);
-  } else {
-    die "$app has a custom request class $req_class, "
-      . "which is not a $class; see Catalyst::Request::REST";
+  }
+  else {
+      my $meta = Moose::Meta::Class->create_anon_class(
+          superclasses => [$req_class],
+          roles => ['Catalyst::TraitFor::Request::REST'],
+          cache => 1
+      );
+      $meta->add_method(meta => sub { $meta });
+      $app->request_class($meta->name);
   }
 }
 
index 2226793..ebb7b7d 100644 (file)
@@ -1,6 +1,6 @@
 use strict;
 use warnings;
-use Test::More tests => 28;
+use Test::More;
 use FindBin;
 use lib ( "$FindBin::Bin/../lib", "$FindBin::Bin/../t/lib" );
 
@@ -175,9 +175,18 @@ use HTTP::Headers;
   is($test->request_class, 'Catalyst::Request::REST',
     'Request::REST took over for Request');
 
-  $test->request_class('Some::Other::Class');
+  my $meta = Moose::Meta::Class->create_anon_class(
+      superclasses => ['Catalyst::Request'],
+  );
+  $meta->add_method('__random_method' => sub { 42 });
+
+  $test->request_class($meta->name);
+  # FIXME - setup_finished(0) is evil!
   eval { $test->setup_finished(0); $test->setup };
-  like $@, qr/$test has a custom request class Some::Other::Class/;
+  ok !$@, 'Can setup again';
+  isnt $test->request_class, $meta->name, 'Different request class';
+  ok $test->request_class->can('__random_method'), 'Is right class';
+  ok $test->request_class->can('data'), 'Also smells like REST subclass';
 
   {
     package My::Request;
@@ -188,6 +197,8 @@ use HTTP::Headers;
   is $@, '', 'no error from Request::REST subclass';
 }
 
+done_testing;
+
 package MockContext;
 
 sub prepare_body { }