predicate fixes
[gitmo/Class-MOP.git] / lib / Class / MOP / Class.pm
index 83b4d1d..ee65f1d 100644 (file)
@@ -13,7 +13,7 @@ use Scalar::Util 'blessed', 'reftype', 'weaken';
 use Sub::Name    'subname';
 use B            'svref_2object';
 
-our $VERSION   = '0.22';
+our $VERSION   = '0.23';
 our $AUTHORITY = 'cpan:STEVAN';
 
 use base 'Class::MOP::Module';
@@ -29,6 +29,9 @@ sub initialize {
     my $package_name = shift;
     (defined $package_name && $package_name && !blessed($package_name))
         || confess "You must pass a package name and it cannot be blessed";
+    if (defined(my $meta = Class::MOP::get_metaclass_by_name($package_name))) {
+        return $meta;
+    }
     $class->construct_class_instance('package' => $package_name, @_);
 }
 
@@ -58,8 +61,10 @@ sub construct_class_instance {
     # and it is still defined (it has not been
     # reaped by DESTROY yet, which can happen
     # annoyingly enough during global destruction)
-    return Class::MOP::get_metaclass_by_name($package_name)
-        if Class::MOP::does_metaclass_exist($package_name);
+
+    if (defined(my $meta = Class::MOP::get_metaclass_by_name($package_name))) {
+        return $meta;
+    }
 
     # NOTE:
     # we need to deal with the possibility
@@ -784,7 +789,7 @@ sub is_immutable { 0 }
         my $self = shift;
         return if $self->is_mutable;
         my $options = delete $IMMUTABLE_OPTIONS{$self->name};
-        confess "unable to find immutabilizing options" unless $options;
+        confess "unable to find immutabilizing options" unless ref $options;
         my $transformer = delete $options->{IMMUTABLE_TRANSFORMER};
         $transformer->make_metaclass_mutable($self, %$options);
     }