Fix Class::AccessorGroup to allow instances in get_component_class.
Gareth Kirwan [Tue, 17 Jul 2012 15:49:50 +0000 (16:49 +0100)]
 Fixes result_class($obj) exploding instead of just using the object.

lib/DBIx/Class/AccessorGroup.pm
t/107obj_result_class.t [new file with mode: 0644]

index 2b0462b..30b3bd8 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 
 use base qw/Class::Accessor::Grouped/;
-use Scalar::Util qw/weaken/;
+use Scalar::Util qw/weaken blessed/;
 use namespace::clean;
 
 my $successfully_loaded_components;
@@ -12,6 +12,9 @@ my $successfully_loaded_components;
 sub get_component_class {
   my $class = $_[0]->get_inherited($_[1]);
 
+  # It's already an object, just go for it.
+  return $class if blessed $class;
+
   if (defined $class and ! $successfully_loaded_components->{$class} ) {
     $_[0]->ensure_class_loaded($class);
 
diff --git a/t/107obj_result_class.t b/t/107obj_result_class.t
new file mode 100644 (file)
index 0000000..f616bcb
--- /dev/null
@@ -0,0 +1,35 @@
+package ResultClassInflator;
+
+sub new { bless {}, __PACKAGE__ }
+
+1;
+
+package main;
+
+use strict;
+use warnings;
+
+use Test::More tests => 6;
+use Test::Exception;
+use lib qw(t/lib);
+use DBICTest;
+
+my $schema = DBICTest->init_schema();
+
+my $source = $schema->source('CD');
+
+lives_ok {
+    $source->result_class('ResultClassInflator');
+    is($source->result_class => 'ResultClassInflator', "result_class gives us back class");
+    is($source->get_component_class('result_class') => 'ResultClassInflator',
+        "and so does get_component_class");
+
+    } 'Result class still works with class';
+lives_ok {
+    my $obj = ResultClassInflator->new();
+    $source->result_class($obj);
+    is($source->result_class => $obj, "result_class gives us back obj");
+    is($source->get_component_class('result_class') => $obj, "and so does get_component_class");
+    } 'Result class works with object';
+
+done_testing;