stop closing over $attr in accessor generation
[gitmo/Moose.git] / lib / Moose / Meta / Method / Accessor.pm
1
2 package Moose::Meta::Method::Accessor;
3
4 use strict;
5 use warnings;
6
7 use Try::Tiny;
8
9 use base 'Moose::Meta::Method',
10          'Class::MOP::Method::Accessor';
11
12 sub _error_thrower {
13     my $self = shift;
14     return $self->associated_attribute
15         if ref($self) && defined($self->associated_attribute);
16     return $self->SUPER::_error_thrower;
17 }
18
19 sub _compile_code {
20     my $self = shift;
21     my @args = @_;
22     try {
23         $self->SUPER::_compile_code(@args);
24     }
25     catch {
26         $self->throw_error(
27             'Could not create writer for '
28           . "'" . $self->associated_attribute->name . "' "
29           . 'because ' . $_,
30             error => $_,
31         );
32     };
33 }
34
35 sub _eval_environment {
36     my $self = shift;
37
38     my $attr                = $self->associated_attribute;
39     my $type_constraint_obj = $attr->type_constraint;
40
41     return {
42         '$trigger'             => \($attr->trigger),
43         '$default'             => \($attr->default),
44         '$meta'                => \$self,
45         '$type_constraint_obj' => \$type_constraint_obj,
46         '$type_constraint'     => \(
47               $type_constraint_obj
48             ? $type_constraint_obj->_compiled_type_constraint
49             : undef
50         ),
51         (
52             $type_constraint_obj
53             ? %{ $type_constraint_obj->inline_environment }
54             : ()
55         ),
56         # XXX ugh
57         ($attr->has_initializer
58             ? ('$attr' => \$attr)
59             : ()),
60     };
61 }
62
63 sub _instance_is_inlinable {
64     my $self = shift;
65     return $self->associated_attribute->associated_class->instance_metaclass->is_inlinable;
66 }
67
68 sub _generate_reader_method {
69     my $self = shift;
70     $self->_instance_is_inlinable ? $self->_generate_reader_method_inline(@_)
71                                   : $self->SUPER::_generate_reader_method(@_);
72 }
73
74 sub _generate_writer_method {
75     my $self = shift;
76     $self->_instance_is_inlinable ? $self->_generate_writer_method_inline(@_)
77                                   : $self->SUPER::_generate_writer_method(@_);
78 }
79
80 sub _generate_accessor_method {
81     my $self = shift;
82     $self->_instance_is_inlinable ? $self->_generate_accessor_method_inline(@_)
83                                   : $self->SUPER::_generate_accessor_method(@_);
84 }
85
86 sub _generate_predicate_method {
87     my $self = shift;
88     $self->_instance_is_inlinable ? $self->_generate_predicate_method_inline(@_)
89                                   : $self->SUPER::_generate_predicate_method(@_);
90 }
91
92 sub _generate_clearer_method {
93     my $self = shift;
94     $self->_instance_is_inlinable ? $self->_generate_clearer_method_inline(@_)
95                                   : $self->SUPER::_generate_clearer_method(@_);
96 }
97
98 sub _writer_value_needs_copy {
99     shift->associated_attribute->_writer_value_needs_copy(@_);
100 }
101
102 sub _inline_tc_code {
103     shift->associated_attribute->_inline_tc_code(@_);
104 }
105
106 sub _inline_check_constraint {
107     shift->associated_attribute->_inline_check_constraint(@_);
108 }
109
110 sub _inline_check_lazy {
111     shift->associated_attribute->_inline_check_lazy(@_);
112 }
113
114 sub _inline_store_value {
115     shift->associated_attribute->_inline_instance_set(@_) . ';';
116 }
117
118 sub _inline_get_old_value_for_trigger {
119     shift->associated_attribute->_inline_get_old_value_for_trigger(@_);
120 }
121
122 sub _inline_trigger {
123     shift->associated_attribute->_inline_trigger(@_);
124 }
125
126 sub _get_value {
127     shift->associated_attribute->_inline_instance_get(@_);
128 }
129
130 sub _has_value {
131     shift->associated_attribute->_inline_instance_has(@_);
132 }
133
134 1;
135
136 # ABSTRACT: A Moose Method metaclass for accessors
137
138 __END__
139
140 =pod
141
142 =head1 DESCRIPTION
143
144 This class is a subclass of L<Class::MOP::Method::Accessor> that
145 provides additional Moose-specific functionality, all of which is
146 private.
147
148 To understand this class, you should read the the
149 L<Class::MOP::Method::Accessor> documentation.
150
151 =head1 BUGS
152
153 See L<Moose/BUGS> for details on reporting bugs.
154
155 =cut