bump version to 0.11
[gitmo/MooseX-ClassAttribute.git] / lib / MooseX / ClassAttribute / Meta / Method / Accessor.pm
index 2f6b0a6..5ef7631 100644 (file)
 package MooseX::ClassAttribute::Meta::Method::Accessor;
 
-use warnings;
 use strict;
+use warnings;
 
-our $VERSION = '0.01';
-our $AUTHORITY = 'cpan:DROLSKY';
+our $VERSION   = '0.11';
 
+use namespace::autoclean;
 use Moose;
 
 extends 'Moose::Meta::Method::Accessor';
 
+sub _generate_predicate_method_inline {
+    my $attr = (shift)->associated_attribute;
+
+    my $code
+        = eval 'sub {'
+        . $attr->associated_class()
+        ->inline_is_class_slot_initialized( $attr->name() ) . '}';
+
+    confess "Could not generate inline predicate because : $@" if $@;
+
+    return $code;
+}
+
+sub _generate_clearer_method_inline {
+    my $attr          = (shift)->associated_attribute;
+    my $meta_instance = $attr->associated_class->instance_metaclass;
+
+    my $code
+        = eval 'sub {'
+        . $attr->associated_class()
+        ->inline_deinitialize_class_slot( $attr->name() ) . '}';
+
+    confess "Could not generate inline clearer because : $@" if $@;
+
+    return $code;
+}
 
 sub _inline_store {
-    my $self     = shift;
-    my $instance = shift;
-    my $value    = shift;
+    my $self = shift;
+    shift;
+    my $value = shift;
 
     my $attr = $self->associated_attribute();
 
-    my $mi = $attr->associated_class()->get_meta_instance();
-    my $slot_name = $attr->slots();
-
-    my $package_var = sprintf q{$%s::__ClassAttribute{'%s'}}, $attr->associated_class()->name(), $slot_name;
+    my $meta = $attr->associated_class();
 
-    my $code = "$package_var = $value;";
-    $code   .= "Scalar::Util::weaken $package_var;"
+    my $code
+        = $meta->inline_set_class_slot_value( $attr->slots(), $value ) . ";";
+    $code
+        .= $meta->inline_weaken_class_slot_value( $attr->slots(), $value )
+        . ";"
         if $attr->is_weak_ref();
 
     return $code;
 }
 
 sub _inline_get {
-    my $self     = shift;
-    my $instance = shift;
+    my $self = shift;
 
-    my $attr = $self->associated_attribute();
+    my $attr = $self->associated_attribute;
+    my $meta = $attr->associated_class();
+
+    return $meta->inline_get_class_slot_value( $attr->slots() );
+}
+
+sub _inline_access {
+    my $self = shift;
 
-    my $mi = $attr->associated_class()->get_meta_instance();
-    my $slot_name = $attr->slots();
+    my $attr = $self->associated_attribute;
+    my $meta = $attr->associated_class();
 
-    return sprintf q{$%s::__ClassAttribute{'%s'}}, $attr->associated_class()->name(), $slot_name;
+    return $meta->inline_class_slot_access( $attr->slots() );
 }
 
-sub generate_accessor_method {
-    shift->generate_accessor_method_inline(@_);
+sub _inline_has {
+    my $self = shift;
+
+    my $attr = $self->associated_attribute;
+    my $meta = $attr->associated_class();
+
+    return $meta->inline_is_class_slot_initialized( $attr->slots() );
 }
 
-sub generate_reader_method {
-    shift->generate_reader_method_inline(@_);
+sub _inline_init_slot {
+    my $self = shift;
+
+    return $self->_inline_store( undef, $_[-1] );
 }
 
-sub generate_writer_method {
-    shift->generate_writer_method_inline(@_);
+sub _inline_check_lazy {
+    my $self = shift;
+
+    return $self->SUPER::_inline_check_lazy( q{'}
+            . $self->associated_attribute()->associated_class()->name()
+            . q{'} );
 }
 
+sub _inline_get_old_value_for_trigger {
+    my $self = shift;
+
+    my $attr = $self->associated_attribute();
+    return '' unless $attr->has_trigger();
+
+    my $pred = $attr->associated_class()
+        ->inline_is_class_slot_initialized( $attr->name() );
+
+    return
+          'my @old = ' 
+        . $pred . q{ ? }
+        . $self->_inline_get()
+        . q{ : ()} . ";\n";
+
+}
 
 1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+MooseX::ClassAttribute::Meta::Method::Accessor - Accessor method generation for class attributes
+
+=head1 DESCRIPTION
+
+This class overrides L<Moose::Meta::Method::Accessor> to do code
+generation properly for class attributes.
+
+=head1 AUTHOR
+
+Dave Rolsky, C<< <autarch@urth.org> >>
+
+=head1 BUGS
+
+See L<MooseX::ClassAttribute> for details.
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2007-2008 Dave Rolsky, All Rights Reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut