Fix add_metaclass_accessor stuff
[gitmo/Mouse.git] / lib / Mouse / PurePerl.pm
index 432d4c7..73374b4 100644 (file)
@@ -242,6 +242,27 @@ sub add_method {
     return;
 }
 
+my $generate_class_accessor = sub {
+    my($name) = @_;
+    return sub {
+        my $self = shift;
+        if(@_) {
+            return $self->{$name} = shift;
+        }
+
+        foreach my $class($self->linearized_isa) {
+            my $meta = Mouse::Util::get_metaclass_by_name($class)
+                or next;
+
+            if(exists $meta->{$name}) {
+                return $meta->{$name};
+            }
+        }
+        return undef;
+    };
+};
+
+
 package Mouse::Meta::Class;
 
 use Mouse::Meta::Method::Constructor;
@@ -363,23 +384,9 @@ sub _initialize_object{
 
 sub is_immutable {  $_[0]->{is_immutable} }
 
-sub strict_constructor{
-    my $self = shift;
-    if(@_) {
-        $self->{strict_constructor} = shift;
-    }
-
-    foreach my $class($self->linearized_isa) {
-        my $meta = Mouse::Util::get_metaclass_by_name($class)
-            or next;
-
-        if(exists $meta->{strict_constructor}) {
-            return $meta->{strict_constructor};
-        }
-    }
-
-    return 0; # false
-}
+Mouse::Util::install_subroutines(__PACKAGE__,
+    strict_constructor => $generate_class_accessor->('strict_constructor'),
+);
 
 sub _report_unknown_args {
     my($metaclass, $attrs, $args) = @_;
@@ -447,6 +454,12 @@ sub get_after_method_modifiers {
     return @{ $self->{after_method_modifiers}{$method_name} ||= [] }
 }
 
+sub add_metaclass_accessor { # for meta roles (a.k.a. traits)
+    my($meta, $name) = @_;
+    $meta->add_method($name => $generate_class_accessor->($name));
+    return;
+}
+
 package Mouse::Meta::Attribute;
 
 require Mouse::Meta::Method::Accessor;
@@ -630,7 +643,7 @@ package Mouse::Meta::TypeConstraint;
 
 use overload
     '""' => '_as_string',
-    '0=' => '_identity',
+    '0+' => '_identity',
     '|'  => '_unite',
 
     fallback => 1;