The start of a working implementation. Several things left to be
[gitmo/MooseX-ClassAttribute.git] / lib / MooseX / ClassAttribute / Meta / Method / Accessor.pm
diff --git a/lib/MooseX/ClassAttribute/Meta/Method/Accessor.pm b/lib/MooseX/ClassAttribute/Meta/Method/Accessor.pm
new file mode 100644 (file)
index 0000000..2f6b0a6
--- /dev/null
@@ -0,0 +1,58 @@
+package MooseX::ClassAttribute::Meta::Method::Accessor;
+
+use warnings;
+use strict;
+
+our $VERSION = '0.01';
+our $AUTHORITY = 'cpan:DROLSKY';
+
+use Moose;
+
+extends 'Moose::Meta::Method::Accessor';
+
+
+sub _inline_store {
+    my $self     = shift;
+    my $instance = 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 $code = "$package_var = $value;";
+    $code   .= "Scalar::Util::weaken $package_var;"
+        if $attr->is_weak_ref();
+
+    return $code;
+}
+
+sub _inline_get {
+    my $self     = shift;
+    my $instance = shift;
+
+    my $attr = $self->associated_attribute();
+
+    my $mi = $attr->associated_class()->get_meta_instance();
+    my $slot_name = $attr->slots();
+
+    return sprintf q{$%s::__ClassAttribute{'%s'}}, $attr->associated_class()->name(), $slot_name;
+}
+
+sub generate_accessor_method {
+    shift->generate_accessor_method_inline(@_);
+}
+
+sub generate_reader_method {
+    shift->generate_reader_method_inline(@_);
+}
+
+sub generate_writer_method {
+    shift->generate_writer_method_inline(@_);
+}
+
+
+1;