Add tests for warning on $object->new and implement immutable version of warning.
Dave Rolsky [Sun, 13 Sep 2009 15:38:08 +0000 (10:38 -0500)]
lib/Moose/Meta/Method/Constructor.pm
lib/Moose/Object.pm
t/010_basics/021-instance-new.t [new file with mode: 0644]

index 4d4a580..e25ae44 100644 (file)
@@ -56,6 +56,10 @@ sub _initialize_body {
     # the author, after all, nothing is free)
     my $source = 'sub {';
     $source .= "\n" . 'my $_instance = shift;';
+
+    $source .= "\n" . q{Carp::cluck 'Calling new() on an instance is deprecated,'
+                        . ' please use (blessed $obj)->new' if blessed $_instance;};
+
     $source .= "\n" . 'my $class = Scalar::Util::blessed($_instance) || $_instance;';
 
     $source .= "\n" . 'return $class->Moose::Object::new(@_)';
index 940bb6f..7702611 100644 (file)
@@ -18,14 +18,12 @@ our $AUTHORITY = 'cpan:STEVAN';
 
 sub new {
     my $class = shift;
-    
+
     Carp::cluck 'Calling new() on an instance is deprecated,'
       . ' please use (blessed $obj)->new' if blessed $class;
-    
+
     my $params = $class->BUILDARGS(@_);
 
-    # We want to support passing $self->new, but initialize
-    # takes only an unblessed class name
     my $real_class = Scalar::Util::blessed($class) || $class;
     my $self = Class::MOP::Class->initialize($real_class)->new_object($params);
 
diff --git a/t/010_basics/021-instance-new.t b/t/010_basics/021-instance-new.t
new file mode 100644 (file)
index 0000000..3555730
--- /dev/null
@@ -0,0 +1,25 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Exception;
+BEGIN {
+    eval "use Test::Output;";
+    plan skip_all => "Test::Output is required for this test" if $@;
+    plan tests => 2;
+}
+
+{
+    package Foo;
+    use Moose;
+}
+
+{
+    my $foo = Foo->new();
+    stderr_like { $foo->new() }
+    qr/\QCalling new() on an instance is deprecated/,
+        '$object->new() is deprecated';
+
+    Foo->meta->make_immutable, redo
+        if Foo->meta->is_mutable;
+}