Fix bug with $obj->new when $obj has stringify overloading
Shawn M Moore [Wed, 12 Aug 2009 01:00:06 +0000 (21:00 -0400)]
Changes
lib/Moose/Meta/Method/Constructor.pm
t/100_bugs/027_constructor_object_overload.t [new file with mode: 0644]

diff --git a/Changes b/Changes
index 96f4f38..038f786 100644 (file)
--- a/Changes
+++ b/Changes
@@ -27,6 +27,10 @@ next version
       - A trigger now receives the old value as a second argument, if
         the attribute had one.
 
+    * Moose::Meta::Method::Constructor
+      - Fix a bug with $obj->new when $obj has stringify overloading.
+        Reported by Andrew Suffield [rt.cpan.org #47882] (Sartak)
+
 0.88 Fri Jul 24, 2009
     * Moose::Manual::Contributing
       - Re-write the Moose::Manual::Contributing document to reflect
index 1d20b73..7e8e2f2 100644 (file)
@@ -60,7 +60,8 @@ sub _initialize_body {
     # requires some adaption on the part of
     # the author, after all, nothing is free)
     my $source = 'sub {';
-    $source .= "\n" . 'my $class = shift;';
+    $source .= "\n" . 'my $_instance = shift;';
+    $source .= "\n" . 'my $class = Scalar::Util::blessed($_instance) || $_instance;';
 
     $source .= "\n" . 'return $class->Moose::Object::new(@_)';
     $source .= "\n    if \$class ne '" . $self->associated_metaclass->name
diff --git a/t/100_bugs/027_constructor_object_overload.t b/t/100_bugs/027_constructor_object_overload.t
new file mode 100644 (file)
index 0000000..09c61d0
--- /dev/null
@@ -0,0 +1,19 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use Test::More tests => 1;
+
+{
+    package Foo;
+
+    use Moose;
+
+    use overload '""' => sub {''};
+
+    sub bug { 'plenty' }
+
+    __PACKAGE__->meta->make_immutable;
+}
+
+ok(Foo->new()->bug(), 'call constructor on object reference with overloading');
+