Add definition context to every accessor defined internally
[gitmo/Moose.git] / lib / Moose / Meta / Attribute.pm
1
2 package Moose::Meta::Attribute;
3
4 use strict;
5 use warnings;
6
7 use Class::MOP ();
8 use B ();
9 use Scalar::Util 'blessed', 'weaken';
10 use List::MoreUtils 'any';
11 use Try::Tiny;
12 use overload     ();
13
14 use Moose::Deprecated;
15 use Moose::Meta::Method::Accessor;
16 use Moose::Meta::Method::Delegation;
17 use Moose::Util ();
18 use Moose::Util::TypeConstraints ();
19 use Class::MOP::MiniTrait;
20
21 use base 'Class::MOP::Attribute', 'Moose::Meta::Mixin::AttributeCore';
22
23 Class::MOP::MiniTrait::apply(__PACKAGE__, 'Moose::Meta::Object::Trait');
24
25 __PACKAGE__->meta->add_attribute('traits' => (
26     reader    => 'applied_traits',
27     predicate => 'has_applied_traits',
28     Class::MOP::_definition_context(),
29 ));
30
31 # we need to have a ->does method in here to
32 # more easily support traits, and the introspection
33 # of those traits. We extend the does check to look
34 # for metatrait aliases.
35 sub does {
36     my ($self, $role_name) = @_;
37     my $name = try {
38         Moose::Util::resolve_metatrait_alias(Attribute => $role_name)
39     };
40     return 0 if !defined($name); # failed to load class
41     return $self->Moose::Object::does($name);
42 }
43
44 sub _error_thrower {
45     my $self = shift;
46     require Moose::Meta::Class;
47     ( ref $self && $self->associated_class ) || "Moose::Meta::Class";
48 }
49
50 sub throw_error {
51     my $self = shift;
52     my $inv = $self->_error_thrower;
53     unshift @_, "message" if @_ % 2 == 1;
54     unshift @_, attr => $self if ref $self;
55     unshift @_, $inv;
56     my $handler = $inv->can("throw_error"); # to avoid incrementing depth by 1
57     goto $handler;
58 }
59
60 sub _inline_throw_error {
61     my ( $self, $msg, $args ) = @_;
62
63     my $inv = $self->_error_thrower;
64     # XXX ugh
65     $inv = 'Moose::Meta::Class' unless $inv->can('_inline_throw_error');
66
67     # XXX ugh ugh UGH
68     my $class = $self->associated_class;
69     if ($class) {
70         my $class_name = B::perlstring($class->name);
71         my $attr_name = B::perlstring($self->name);
72         $args = 'attr => Class::MOP::class_of(' . $class_name . ')'
73               . '->find_attribute_by_name(' . $attr_name . '), '
74               . (defined $args ? $args : '');
75     }
76
77     return $inv->_inline_throw_error($msg, $args)
78 }
79
80 sub new {
81     my ($class, $name, %options) = @_;
82     $class->_process_options($name, \%options) unless $options{__hack_no_process_options}; # used from clone()... YECHKKK FIXME ICKY YUCK GROSS
83     
84     delete $options{__hack_no_process_options};
85
86     my %attrs =
87         ( map { $_ => 1 }
88           grep { defined }
89           map { $_->init_arg() }
90           $class->meta()->get_all_attributes()
91         );
92
93     my @bad = sort grep { ! $attrs{$_} }  keys %options;
94
95     if (@bad)
96     {
97         Carp::cluck "Found unknown argument(s) passed to '$name' attribute constructor in '$class': @bad";
98     }
99
100     return $class->SUPER::new($name, %options);
101 }
102
103 sub interpolate_class_and_new {
104     my ($class, $name, %args) = @_;
105
106     my ( $new_class, @traits ) = $class->interpolate_class(\%args);
107
108     $new_class->new($name, %args, ( scalar(@traits) ? ( traits => \@traits ) : () ) );
109 }
110
111 sub interpolate_class {
112     my ($class, $options) = @_;
113
114     $class = ref($class) || $class;
115
116     if ( my $metaclass_name = delete $options->{metaclass} ) {
117         my $new_class = Moose::Util::resolve_metaclass_alias( Attribute => $metaclass_name );
118
119         if ( $class ne $new_class ) {
120             if ( $new_class->can("interpolate_class") ) {
121                 return $new_class->interpolate_class($options);
122             } else {
123                 $class = $new_class;
124             }
125         }
126     }
127
128     my @traits;
129
130     if (my $traits = $options->{traits}) {
131         my $i = 0;
132         while ($i < @$traits) {
133             my $trait = $traits->[$i++];
134             next if ref($trait); # options to a trait we discarded
135
136             $trait = Moose::Util::resolve_metatrait_alias(Attribute => $trait)
137                   || $trait;
138
139             next if $class->does($trait);
140
141             push @traits, $trait;
142
143             # are there options?
144             push @traits, $traits->[$i++]
145                 if $traits->[$i] && ref($traits->[$i]);
146         }
147
148         if (@traits) {
149             my $anon_class = Moose::Meta::Class->create_anon_class(
150                 superclasses => [ $class ],
151                 roles        => [ @traits ],
152                 cache        => 1,
153             );
154
155             $class = $anon_class->name;
156         }
157     }
158
159     return ( wantarray ? ( $class, @traits ) : $class );
160 }
161
162 # ...
163
164 # method-generating options shouldn't be overridden
165 sub illegal_options_for_inheritance {
166     qw(reader writer accessor clearer predicate)
167 }
168
169 # NOTE/TODO
170 # This method *must* be able to handle
171 # Class::MOP::Attribute instances as
172 # well. Yes, I know that is wrong, but
173 # apparently we didn't realize it was
174 # doing that and now we have some code
175 # which is dependent on it. The real
176 # solution of course is to push this
177 # feature back up into Class::MOP::Attribute
178 # but I not right now, I am too lazy.
179 # However if you are reading this and
180 # looking for something to do,.. please
181 # be my guest.
182 # - stevan
183 sub clone_and_inherit_options {
184     my ($self, %options) = @_;
185
186     # NOTE:
187     # we may want to extends a Class::MOP::Attribute
188     # in which case we need to be able to use the
189     # core set of legal options that have always
190     # been here. But we allows Moose::Meta::Attribute
191     # instances to changes them.
192     # - SL
193     my @illegal_options = $self->can('illegal_options_for_inheritance')
194         ? $self->illegal_options_for_inheritance
195         : ();
196
197     my @found_illegal_options = grep { exists $options{$_} && exists $self->{$_} ? $_ : undef } @illegal_options;
198     (scalar @found_illegal_options == 0)
199         || $self->throw_error("Illegal inherited options => (" . (join ', ' => @found_illegal_options) . ")", data => \%options);
200
201     if ($options{isa}) {
202         my $type_constraint;
203         if (blessed($options{isa}) && $options{isa}->isa('Moose::Meta::TypeConstraint')) {
204             $type_constraint = $options{isa};
205         }
206         else {
207             $type_constraint = Moose::Util::TypeConstraints::find_or_create_isa_type_constraint($options{isa});
208             (defined $type_constraint)
209                 || $self->throw_error("Could not find the type constraint '" . $options{isa} . "'", data => $options{isa});
210         }
211
212         $options{type_constraint} = $type_constraint;
213     }
214
215     if ($options{does}) {
216         my $type_constraint;
217         if (blessed($options{does}) && $options{does}->isa('Moose::Meta::TypeConstraint')) {
218             $type_constraint = $options{does};
219         }
220         else {
221             $type_constraint = Moose::Util::TypeConstraints::find_or_create_does_type_constraint($options{does});
222             (defined $type_constraint)
223                 || $self->throw_error("Could not find the type constraint '" . $options{does} . "'", data => $options{does});
224         }
225
226         $options{type_constraint} = $type_constraint;
227     }
228
229     # NOTE:
230     # this doesn't apply to Class::MOP::Attributes,
231     # so we can ignore it for them.
232     # - SL
233     if ($self->can('interpolate_class')) {
234         ( $options{metaclass}, my @traits ) = $self->interpolate_class(\%options);
235
236         my %seen;
237         my @all_traits = grep { $seen{$_}++ } @{ $self->applied_traits || [] }, @traits;
238         $options{traits} = \@all_traits if @all_traits;
239     }
240
241     # This method can be called on a CMOP::Attribute object, so we need to
242     # make sure we can call this method.
243     $self->_process_lazy_build_option( $self->name, \%options )
244         if $self->can('_process_lazy_build_option');
245
246     $self->clone(%options);
247 }
248
249 sub clone {
250     my ( $self, %params ) = @_;
251
252     my $class = delete $params{metaclass} || ref $self;
253
254     my ( @init, @non_init );
255
256     foreach my $attr ( grep { $_->has_value($self) } Class::MOP::class_of($self)->get_all_attributes ) {
257         push @{ $attr->has_init_arg ? \@init : \@non_init }, $attr;
258     }
259
260     my %new_params = ( ( map { $_->init_arg => $_->get_value($self) } @init ), %params );
261
262     my $name = delete $new_params{name};
263
264     my $clone = $class->new($name, %new_params, __hack_no_process_options => 1 );
265
266     foreach my $attr ( @non_init ) {
267         $attr->set_value($clone, $attr->get_value($self));
268     }
269
270     return $clone;
271 }
272
273 sub _process_options {
274     my ( $class, $name, $options ) = @_;
275
276     $class->_process_is_option( $name, $options );
277     $class->_process_isa_option( $name, $options );
278     $class->_process_does_option( $name, $options );
279     $class->_process_coerce_option( $name, $options );
280     $class->_process_trigger_option( $name, $options );
281     $class->_process_auto_deref_option( $name, $options );
282     $class->_process_lazy_build_option( $name, $options );
283     $class->_process_lazy_option( $name, $options );
284     $class->_process_required_option( $name, $options );
285 }
286
287 sub _process_is_option {
288     my ( $class, $name, $options ) = @_;
289
290     return unless $options->{is};
291
292     ### -------------------------
293     ## is => ro, writer => _foo    # turns into (reader => foo, writer => _foo) as before
294     ## is => rw, writer => _foo    # turns into (reader => foo, writer => _foo)
295     ## is => rw, accessor => _foo  # turns into (accessor => _foo)
296     ## is => ro, accessor => _foo  # error, accesor is rw
297     ### -------------------------
298
299     if ( $options->{is} eq 'ro' ) {
300         $class->throw_error(
301             "Cannot define an accessor name on a read-only attribute, accessors are read/write",
302             data => $options )
303             if exists $options->{accessor};
304         $options->{reader} ||= $name;
305     }
306     elsif ( $options->{is} eq 'rw' ) {
307         if ( $options->{writer} ) {
308             $options->{reader} ||= $name;
309         }
310         else {
311             $options->{accessor} ||= $name;
312         }
313     }
314     elsif ( $options->{is} eq 'bare' ) {
315         return;
316         # do nothing, but don't complain (later) about missing methods
317     }
318     else {
319         $class->throw_error( "I do not understand this option (is => "
320                 . $options->{is}
321                 . ") on attribute ($name)", data => $options->{is} );
322     }
323 }
324
325 sub _process_isa_option {
326     my ( $class, $name, $options ) = @_;
327
328     return unless exists $options->{isa};
329
330     if ( exists $options->{does} ) {
331         if ( try { $options->{isa}->can('does') } ) {
332             ( $options->{isa}->does( $options->{does} ) )
333                 || $class->throw_error(
334                 "Cannot have an isa option and a does option if the isa does not do the does on attribute ($name)",
335                 data => $options );
336         }
337         else {
338             $class->throw_error(
339                 "Cannot have an isa option which cannot ->does() on attribute ($name)",
340                 data => $options );
341         }
342     }
343
344     # allow for anon-subtypes here ...
345     if ( blessed( $options->{isa} )
346         && $options->{isa}->isa('Moose::Meta::TypeConstraint') ) {
347         $options->{type_constraint} = $options->{isa};
348     }
349     else {
350         $options->{type_constraint}
351             = Moose::Util::TypeConstraints::find_or_create_isa_type_constraint(
352             $options->{isa} );
353     }
354 }
355
356 sub _process_does_option {
357     my ( $class, $name, $options ) = @_;
358
359     return unless exists $options->{does} && ! exists $options->{isa};
360
361     # allow for anon-subtypes here ...
362     if ( blessed( $options->{does} )
363         && $options->{does}->isa('Moose::Meta::TypeConstraint') ) {
364         $options->{type_constraint} = $options->{does};
365     }
366     else {
367         $options->{type_constraint}
368             = Moose::Util::TypeConstraints::find_or_create_does_type_constraint(
369             $options->{does} );
370     }
371 }
372
373 sub _process_coerce_option {
374     my ( $class, $name, $options ) = @_;
375
376     return unless $options->{coerce};
377
378     ( exists $options->{type_constraint} )
379         || $class->throw_error(
380         "You cannot have coercion without specifying a type constraint on attribute ($name)",
381         data => $options );
382
383     $class->throw_error(
384         "You cannot have a weak reference to a coerced value on attribute ($name)",
385         data => $options )
386         if $options->{weak_ref};
387
388     unless ( $options->{type_constraint}->has_coercion ) {
389         my $type = $options->{type_constraint}->name;
390
391         Moose::Deprecated::deprecated(
392             feature => 'coerce without coercion',
393             message =>
394                 "You cannot coerce an attribute ($name) unless its type ($type) has a coercion"
395         );
396     }
397 }
398
399 sub _process_trigger_option {
400     my ( $class, $name, $options ) = @_;
401
402     return unless exists $options->{trigger};
403
404     ( 'CODE' eq ref $options->{trigger} )
405         || $class->throw_error("Trigger must be a CODE ref on attribute ($name)", data => $options->{trigger});
406 }
407
408 sub _process_auto_deref_option {
409     my ( $class, $name, $options ) = @_;
410
411     return unless $options->{auto_deref};
412
413     ( exists $options->{type_constraint} )
414         || $class->throw_error(
415         "You cannot auto-dereference without specifying a type constraint on attribute ($name)",
416         data => $options );
417
418     ( $options->{type_constraint}->is_a_type_of('ArrayRef')
419       || $options->{type_constraint}->is_a_type_of('HashRef') )
420         || $class->throw_error(
421         "You cannot auto-dereference anything other than a ArrayRef or HashRef on attribute ($name)",
422         data => $options );
423 }
424
425 sub _process_lazy_build_option {
426     my ( $class, $name, $options ) = @_;
427
428     return unless $options->{lazy_build};
429
430     $class->throw_error(
431         "You can not use lazy_build and default for the same attribute ($name)",
432         data => $options )
433         if exists $options->{default};
434
435     $options->{lazy} = 1;
436     $options->{builder} ||= "_build_${name}";
437
438     if ( $name =~ /^_/ ) {
439         $options->{clearer}   ||= "_clear${name}";
440         $options->{predicate} ||= "_has${name}";
441     }
442     else {
443         $options->{clearer}   ||= "clear_${name}";
444         $options->{predicate} ||= "has_${name}";
445     }
446 }
447
448 sub _process_lazy_option {
449     my ( $class, $name, $options ) = @_;
450
451     return unless $options->{lazy};
452
453     ( exists $options->{default} || defined $options->{builder} )
454         || $class->throw_error(
455         "You cannot have a lazy attribute ($name) without specifying a default value for it",
456         data => $options );
457 }
458
459 sub _process_required_option {
460     my ( $class, $name, $options ) = @_;
461
462     if (
463         $options->{required}
464         && !(
465             ( !exists $options->{init_arg} || defined $options->{init_arg} )
466             || exists $options->{default}
467             || defined $options->{builder}
468         )
469         ) {
470         $class->throw_error(
471             "You cannot have a required attribute ($name) without a default, builder, or an init_arg",
472             data => $options );
473     }
474 }
475
476 sub initialize_instance_slot {
477     my ($self, $meta_instance, $instance, $params) = @_;
478     my $init_arg = $self->init_arg();
479     # try to fetch the init arg from the %params ...
480
481     my $val;
482     my $value_is_set;
483     if ( defined($init_arg) and exists $params->{$init_arg}) {
484         $val = $params->{$init_arg};
485         $value_is_set = 1;
486     }
487     else {
488         # skip it if it's lazy
489         return if $self->is_lazy;
490         # and die if it's required and doesn't have a default value
491         $self->throw_error("Attribute (" . $self->name . ") is required", object => $instance, data => $params)
492             if $self->is_required && !$self->has_default && !$self->has_builder;
493
494         # if nothing was in the %params, we can use the
495         # attribute's default value (if it has one)
496         if ($self->has_default) {
497             $val = $self->default($instance);
498             $value_is_set = 1;
499         }
500         elsif ($self->has_builder) {
501             $val = $self->_call_builder($instance);
502             $value_is_set = 1;
503         }
504     }
505
506     return unless $value_is_set;
507
508     $val = $self->_coerce_and_verify( $val, $instance );
509
510     $self->set_initial_value($instance, $val);
511
512     if ( ref $val && $self->is_weak_ref ) {
513         $self->_weaken_value($instance);
514     }
515 }
516
517 sub _call_builder {
518     my ( $self, $instance ) = @_;
519
520     my $builder = $self->builder();
521
522     return $instance->$builder()
523         if $instance->can( $self->builder );
524
525     $self->throw_error(  blessed($instance)
526             . " does not support builder method '"
527             . $self->builder
528             . "' for attribute '"
529             . $self->name
530             . "'",
531             object => $instance,
532      );
533 }
534
535 ## Slot management
536
537 sub _make_initializer_writer_callback {
538     my $self = shift;
539     my ($meta_instance, $instance, $slot_name) = @_;
540     my $old_callback = $self->SUPER::_make_initializer_writer_callback(@_);
541     return sub {
542         $old_callback->($self->_coerce_and_verify($_[0], $instance));
543     };
544 }
545
546 sub set_value {
547     my ($self, $instance, @args) = @_;
548     my $value = $args[0];
549
550     my $attr_name = quotemeta($self->name);
551
552     if ($self->is_required and not @args) {
553         $self->throw_error("Attribute ($attr_name) is required", object => $instance);
554     }
555
556     $value = $self->_coerce_and_verify( $value, $instance );
557
558     my @old;
559     if ( $self->has_trigger && $self->has_value($instance) ) {
560         @old = $self->get_value($instance, 'for trigger');
561     }
562
563     $self->SUPER::set_value($instance, $value);
564
565     if ( ref $value && $self->is_weak_ref ) {
566         $self->_weaken_value($instance);
567     }
568
569     if ($self->has_trigger) {
570         $self->trigger->($instance, $value, @old);
571     }
572 }
573
574 sub _inline_set_value {
575     my $self = shift;
576     my ($instance, $value, $tc, $coercion, $message, $for_constructor) = @_;
577
578     my $old     = '@old';
579     my $copy    = '$val';
580     $tc       ||= '$type_constraint';
581     $coercion ||= '$type_coercion';
582     $message  ||= '$type_message';
583
584     my @code;
585     if ($self->_writer_value_needs_copy) {
586         push @code, $self->_inline_copy_value($value, $copy);
587         $value = $copy;
588     }
589
590     # constructors already handle required checks
591     push @code, $self->_inline_check_required
592         unless $for_constructor;
593
594     push @code, $self->_inline_tc_code($value, $tc, $coercion, $message);
595
596     # constructors do triggers all at once at the end
597     push @code, $self->_inline_get_old_value_for_trigger($instance, $old)
598         unless $for_constructor;
599
600     push @code, (
601         $self->SUPER::_inline_set_value($instance, $value),
602         $self->_inline_weaken_value($instance, $value),
603     );
604
605     # constructors do triggers all at once at the end
606     push @code, $self->_inline_trigger($instance, $value, $old)
607         unless $for_constructor;
608
609     return @code;
610 }
611
612 sub _writer_value_needs_copy {
613     my $self = shift;
614     return $self->should_coerce;
615 }
616
617 sub _inline_copy_value {
618     my $self = shift;
619     my ($value, $copy) = @_;
620
621     return 'my ' . $copy . ' = ' . $value . ';'
622 }
623
624 sub _inline_check_required {
625     my $self = shift;
626
627     return unless $self->is_required;
628
629     my $attr_name = quotemeta($self->name);
630
631     return (
632         'if (@_ < 2) {',
633             $self->_inline_throw_error(
634                 '"Attribute (' . $attr_name . ') is required, so cannot '
635               . 'be set to undef"' # defined $_[1] is not good enough
636             ) . ';',
637         '}',
638     );
639 }
640
641 sub _inline_tc_code {
642     my $self = shift;
643     my ($value, $tc, $coercion, $message, $is_lazy) = @_;
644     return (
645         $self->_inline_check_coercion(
646             $value, $tc, $coercion, $is_lazy,
647         ),
648         $self->_inline_check_constraint(
649             $value, $tc, $message, $is_lazy,
650         ),
651     );
652 }
653
654 sub _inline_check_coercion {
655     my $self = shift;
656     my ($value, $tc, $coercion) = @_;
657
658     return unless $self->should_coerce && $self->type_constraint->has_coercion;
659
660     if ( $self->type_constraint->can_be_inlined ) {
661         return (
662             'if (! (' . $self->type_constraint->_inline_check($value) . ')) {',
663                 $value . ' = ' . $coercion . '->(' . $value . ');',
664             '}',
665         );
666     }
667     else {
668         return (
669             'if (!' . $tc . '->(' . $value . ')) {',
670                 $value . ' = ' . $coercion . '->(' . $value . ');',
671             '}',
672         );
673     }
674 }
675
676 sub _inline_check_constraint {
677     my $self = shift;
678     my ($value, $tc, $message) = @_;
679
680     return unless $self->has_type_constraint;
681
682     my $attr_name = quotemeta($self->name);
683
684     if ( $self->type_constraint->can_be_inlined ) {
685         return (
686             'if (! (' . $self->type_constraint->_inline_check($value) . ')) {',
687                 $self->_inline_throw_error(
688                     '"Attribute (' . $attr_name . ') does not pass the type '
689                   . 'constraint because: " . '
690                   . 'do { local $_ = ' . $value . '; '
691                       . $message . '->(' . $value . ')'
692                   . '}',
693                     'data => ' . $value
694                 ) . ';',
695             '}',
696         );
697     }
698     else {
699         return (
700             'if (!' . $tc . '->(' . $value . ')) {',
701                 $self->_inline_throw_error(
702                     '"Attribute (' . $attr_name . ') does not pass the type '
703                   . 'constraint because: " . '
704                   . 'do { local $_ = ' . $value . '; '
705                       . $message . '->(' . $value . ')'
706                   . '}',
707                     'data => ' . $value
708                 ) . ';',
709             '}',
710         );
711     }
712 }
713
714 sub _inline_get_old_value_for_trigger {
715     my $self = shift;
716     my ($instance, $old) = @_;
717
718     return unless $self->has_trigger;
719
720     return (
721         'my ' . $old . ' = ' . $self->_inline_instance_has($instance),
722             '? ' . $self->_inline_instance_get($instance),
723             ': ();',
724     );
725 }
726
727 sub _inline_weaken_value {
728     my $self = shift;
729     my ($instance, $value) = @_;
730
731     return unless $self->is_weak_ref;
732
733     my $mi = $self->associated_class->get_meta_instance;
734     return (
735         $mi->inline_weaken_slot_value($instance, $self->name, $value),
736             'if ref ' . $value . ';',
737     );
738 }
739
740 sub _inline_trigger {
741     my $self = shift;
742     my ($instance, $value, $old) = @_;
743
744     return unless $self->has_trigger;
745
746     return '$trigger->(' . $instance . ', ' . $value . ', ' . $old . ');';
747 }
748
749 sub _weaken_value {
750     my ( $self, $instance ) = @_;
751
752     my $meta_instance = Class::MOP::Class->initialize( blessed($instance) )
753         ->get_meta_instance;
754
755     $meta_instance->weaken_slot_value( $instance, $self->name );
756 }
757
758 sub get_value {
759     my ($self, $instance, $for_trigger) = @_;
760
761     if ($self->is_lazy) {
762         unless ($self->has_value($instance)) {
763             my $value;
764             if ($self->has_default) {
765                 $value = $self->default($instance);
766             } elsif ( $self->has_builder ) {
767                 $value = $self->_call_builder($instance);
768             }
769
770             $value = $self->_coerce_and_verify( $value, $instance );
771
772             $self->set_initial_value($instance, $value);
773         }
774     }
775
776     if ( $self->should_auto_deref && ! $for_trigger ) {
777
778         my $type_constraint = $self->type_constraint;
779
780         if ($type_constraint->is_a_type_of('ArrayRef')) {
781             my $rv = $self->SUPER::get_value($instance);
782             return unless defined $rv;
783             return wantarray ? @{ $rv } : $rv;
784         }
785         elsif ($type_constraint->is_a_type_of('HashRef')) {
786             my $rv = $self->SUPER::get_value($instance);
787             return unless defined $rv;
788             return wantarray ? %{ $rv } : $rv;
789         }
790         else {
791             $self->throw_error("Can not auto de-reference the type constraint '" . $type_constraint->name . "'", object => $instance, type_constraint => $type_constraint);
792         }
793
794     }
795     else {
796
797         return $self->SUPER::get_value($instance);
798     }
799 }
800
801 sub _inline_get_value {
802     my $self = shift;
803     my ($instance, $tc, $coercion, $message) = @_;
804
805     my $slot_access = $self->_inline_instance_get($instance);
806     $tc           ||= '$type_constraint';
807     $coercion     ||= '$type_coercion';
808     $message      ||= '$type_message';
809
810     return (
811         $self->_inline_check_lazy($instance, $tc, $coercion, $message),
812         $self->_inline_return_auto_deref($slot_access),
813     );
814 }
815
816 sub _inline_check_lazy {
817     my $self = shift;
818     my ($instance, $tc, $coercion, $message) = @_;
819
820     return unless $self->is_lazy;
821
822     my $slot_exists = $self->_inline_instance_has($instance);
823
824     return (
825         'if (!' . $slot_exists . ') {',
826             $self->_inline_init_from_default($instance, '$default', $tc, $coercion, $message, 'lazy'),
827         '}',
828     );
829 }
830
831 sub _inline_init_from_default {
832     my $self = shift;
833     my ($instance, $default, $tc, $coercion, $message, $for_lazy) = @_;
834
835     if (!($self->has_default || $self->has_builder)) {
836         $self->throw_error(
837             'You cannot have a lazy attribute '
838           . '(' . $self->name . ') '
839           . 'without specifying a default value for it',
840             attr => $self,
841         );
842     }
843
844     return (
845         $self->_inline_generate_default($instance, $default),
846         # intentionally not using _inline_tc_code, since that can be overridden
847         # to do things like possibly only do member tc checks, which isn't
848         # appropriate for checking the result of a default
849         $self->has_type_constraint
850             ? ($self->_inline_check_coercion($default, $tc, $coercion, $for_lazy),
851                $self->_inline_check_constraint($default, $tc, $message, $for_lazy))
852             : (),
853         $self->_inline_init_slot($instance, $default),
854     );
855 }
856
857 sub _inline_generate_default {
858     my $self = shift;
859     my ($instance, $default) = @_;
860
861     if ($self->has_default) {
862         my $source = 'my ' . $default . ' = $default';
863         $source .= '->(' . $instance . ')'
864             if $self->is_default_a_coderef;
865         return $source . ';';
866     }
867     elsif ($self->has_builder) {
868         my $builder = B::perlstring($self->builder);
869         my $builder_str = quotemeta($self->builder);
870         my $attr_name_str = quotemeta($self->name);
871         return (
872             'my ' . $default . ';',
873             'if (my $builder = ' . $instance . '->can(' . $builder . ')) {',
874                 $default . ' = ' . $instance . '->$builder;',
875             '}',
876             'else {',
877                 'my $class = ref(' . $instance . ') || ' . $instance . ';',
878                 $self->_inline_throw_error(
879                     '"$class does not support builder method '
880                   . '\'' . $builder_str . '\' for attribute '
881                   . '\'' . $attr_name_str . '\'"'
882                 ) . ';',
883             '}',
884         );
885     }
886     else {
887         $self->throw_error(
888             "Can't generate a default for " . $self->name
889           . " since no default or builder was specified"
890         );
891     }
892 }
893
894 sub _inline_init_slot {
895     my $self = shift;
896     my ($inv, $value) = @_;
897
898     if ($self->has_initializer) {
899         return '$attr->set_initial_value(' . $inv . ', ' . $value . ');';
900     }
901     else {
902         return $self->_inline_instance_set($inv, $value) . ';';
903     }
904 }
905
906 sub _inline_return_auto_deref {
907     my $self = shift;
908
909     return 'return ' . $self->_auto_deref(@_) . ';';
910 }
911
912 sub _auto_deref {
913     my $self = shift;
914     my ($ref_value) = @_;
915
916     return $ref_value unless $self->should_auto_deref;
917
918     my $type_constraint = $self->type_constraint;
919
920     my $sigil;
921     if ($type_constraint->is_a_type_of('ArrayRef')) {
922         $sigil = '@';
923     }
924     elsif ($type_constraint->is_a_type_of('HashRef')) {
925         $sigil = '%';
926     }
927     else {
928         $self->throw_error(
929             'Can not auto de-reference the type constraint \''
930           . $type_constraint->name
931           . '\'',
932             type_constraint => $type_constraint,
933         );
934     }
935
936     return 'wantarray '
937              . '? ' . $sigil . '{ (' . $ref_value . ') || return } '
938              . ': (' . $ref_value . ')';
939 }
940
941 ## installing accessors
942
943 sub accessor_metaclass { 'Moose::Meta::Method::Accessor' }
944
945 sub install_accessors {
946     my $self = shift;
947     $self->SUPER::install_accessors(@_);
948     $self->install_delegation if $self->has_handles;
949     return;
950 }
951
952 sub _check_associated_methods {
953     my $self = shift;
954     unless (
955         @{ $self->associated_methods }
956         || ($self->_is_metadata || '') eq 'bare'
957     ) {
958         Carp::cluck(
959             'Attribute (' . $self->name . ') of class '
960             . $self->associated_class->name
961             . ' has no associated methods'
962             . ' (did you mean to provide an "is" argument?)'
963             . "\n"
964         )
965     }
966 }
967
968 sub _process_accessors {
969     my $self = shift;
970     my ($type, $accessor, $generate_as_inline_methods) = @_;
971
972     $accessor = ( keys %$accessor )[0] if ( ref($accessor) || '' ) eq 'HASH';
973     my $method = $self->associated_class->get_method($accessor);
974
975     if (   $method
976         && $method->isa('Class::MOP::Method::Accessor')
977         && $method->associated_attribute->name ne $self->name ) {
978
979         my $other_attr_name = $method->associated_attribute->name;
980         my $name            = $self->name;
981
982         Carp::cluck(
983             "You are overwriting an accessor ($accessor) for the $other_attr_name attribute"
984                 . " with a new accessor method for the $name attribute" );
985     }
986
987     if (
988            $method
989         && !$method->isa('Class::MOP::Method::Accessor')
990         && (  !$self->definition_context
991             || $method->package_name eq $self->definition_context->{package} )
992         ) {
993
994         Carp::cluck(
995             "You are overwriting a locally defined method ($accessor) with "
996                 . "an accessor" );
997     }
998
999     if (  !$self->associated_class->has_method($accessor)
1000         && $self->associated_class->has_package_symbol( '&' . $accessor ) ) {
1001
1002         Carp::cluck(
1003             "You are overwriting a locally defined function ($accessor) with "
1004                 . "an accessor" );
1005     }
1006
1007     $self->SUPER::_process_accessors(@_);
1008 }
1009
1010 sub remove_accessors {
1011     my $self = shift;
1012     $self->SUPER::remove_accessors(@_);
1013     $self->remove_delegation if $self->has_handles;
1014     return;
1015 }
1016
1017 sub install_delegation {
1018     my $self = shift;
1019
1020     # NOTE:
1021     # Here we canonicalize the 'handles' option
1022     # this will sort out any details and always
1023     # return an hash of methods which we want
1024     # to delagate to, see that method for details
1025     my %handles = $self->_canonicalize_handles;
1026
1027
1028     # install the delegation ...
1029     my $associated_class = $self->associated_class;
1030     foreach my $handle (keys %handles) {
1031         my $method_to_call = $handles{$handle};
1032         my $class_name = $associated_class->name;
1033         my $name = "${class_name}::${handle}";
1034
1035             (!$associated_class->has_method($handle))
1036                 || $self->throw_error("You cannot overwrite a locally defined method ($handle) with a delegation", method_name => $handle);
1037
1038         # NOTE:
1039         # handles is not allowed to delegate
1040         # any of these methods, as they will
1041         # override the ones in your class, which
1042         # is almost certainly not what you want.
1043
1044         # FIXME warn when $handle was explicitly specified, but not if the source is a regex or something
1045         #cluck("Not delegating method '$handle' because it is a core method") and
1046         next if $class_name->isa("Moose::Object") and $handle =~ /^BUILD|DEMOLISH$/ || Moose::Object->can($handle);
1047
1048         my $method = $self->_make_delegation_method($handle, $method_to_call);
1049
1050         $self->associated_class->add_method($method->name, $method);
1051         $self->associate_method($method);
1052     }
1053 }
1054
1055 sub remove_delegation {
1056     my $self = shift;
1057     my %handles = $self->_canonicalize_handles;
1058     my $associated_class = $self->associated_class;
1059     foreach my $handle (keys %handles) {
1060         next unless any { $handle eq $_ }
1061                     map { $_->name }
1062                     @{ $self->associated_methods };
1063         $self->associated_class->remove_method($handle);
1064     }
1065 }
1066
1067 # private methods to help delegation ...
1068
1069 sub _canonicalize_handles {
1070     my $self    = shift;
1071     my $handles = $self->handles;
1072     if (my $handle_type = ref($handles)) {
1073         if ($handle_type eq 'HASH') {
1074             return %{$handles};
1075         }
1076         elsif ($handle_type eq 'ARRAY') {
1077             return map { $_ => $_ } @{$handles};
1078         }
1079         elsif ($handle_type eq 'Regexp') {
1080             ($self->has_type_constraint)
1081                 || $self->throw_error("Cannot delegate methods based on a Regexp without a type constraint (isa)", data => $handles);
1082             return map  { ($_ => $_) }
1083                    grep { /$handles/ } $self->_get_delegate_method_list;
1084         }
1085         elsif ($handle_type eq 'CODE') {
1086             return $handles->($self, $self->_find_delegate_metaclass);
1087         }
1088         elsif (blessed($handles) && $handles->isa('Moose::Meta::TypeConstraint::DuckType')) {
1089             return map { $_ => $_ } @{ $handles->methods };
1090         }
1091         elsif (blessed($handles) && $handles->isa('Moose::Meta::TypeConstraint::Role')) {
1092             $handles = $handles->role;
1093         }
1094         else {
1095             $self->throw_error("Unable to canonicalize the 'handles' option with $handles", data => $handles);
1096         }
1097     }
1098
1099     Class::MOP::load_class($handles);
1100     my $role_meta = Class::MOP::class_of($handles);
1101
1102     (blessed $role_meta && $role_meta->isa('Moose::Meta::Role'))
1103         || $self->throw_error("Unable to canonicalize the 'handles' option with $handles because its metaclass is not a Moose::Meta::Role", data => $handles);
1104
1105     return map { $_ => $_ }
1106         map { $_->name }
1107         grep { !$_->isa('Class::MOP::Method::Meta') } (
1108         $role_meta->_get_local_methods,
1109         $role_meta->get_required_method_list,
1110         );
1111 }
1112
1113 sub _get_delegate_method_list {
1114     my $self = shift;
1115     my $meta = $self->_find_delegate_metaclass;
1116     if ($meta->isa('Class::MOP::Class')) {
1117         return map  { $_->name }  # NOTE: !never! delegate &meta
1118                grep { $_->package_name ne 'Moose::Object' && !$_->isa('Class::MOP::Method::Meta') }
1119                     $meta->get_all_methods;
1120     }
1121     elsif ($meta->isa('Moose::Meta::Role')) {
1122         return $meta->get_method_list;
1123     }
1124     else {
1125         $self->throw_error("Unable to recognize the delegate metaclass '$meta'", data => $meta);
1126     }
1127 }
1128
1129 sub _find_delegate_metaclass {
1130     my $self = shift;
1131     if (my $class = $self->_isa_metadata) {
1132         unless ( Class::MOP::is_class_loaded($class) ) {
1133             $self->throw_error(
1134                 sprintf(
1135                     'The %s attribute is trying to delegate to a class which has not been loaded - %s',
1136                     $self->name, $class
1137                 )
1138             );
1139         }
1140         # we might be dealing with a non-Moose class,
1141         # and need to make our own metaclass. if there's
1142         # already a metaclass, it will be returned
1143         return Class::MOP::Class->initialize($class);
1144     }
1145     elsif (my $role = $self->_does_metadata) {
1146         unless ( Class::MOP::is_class_loaded($class) ) {
1147             $self->throw_error(
1148                 sprintf(
1149                     'The %s attribute is trying to delegate to a role which has not been loaded - %s',
1150                     $self->name, $role
1151                 )
1152             );
1153         }
1154
1155         return Class::MOP::class_of($role);
1156     }
1157     else {
1158         $self->throw_error("Cannot find delegate metaclass for attribute " . $self->name);
1159     }
1160 }
1161
1162 sub delegation_metaclass { 'Moose::Meta::Method::Delegation' }
1163
1164 sub _make_delegation_method {
1165     my ( $self, $handle_name, $method_to_call ) = @_;
1166
1167     my @curried_arguments;
1168
1169     ($method_to_call, @curried_arguments) = @$method_to_call
1170         if 'ARRAY' eq ref($method_to_call);
1171
1172     return $self->delegation_metaclass->new(
1173         name               => $handle_name,
1174         package_name       => $self->associated_class->name,
1175         attribute          => $self,
1176         delegate_to_method => $method_to_call,
1177         curried_arguments  => \@curried_arguments,
1178     );
1179 }
1180
1181 sub _coerce_and_verify {
1182     my $self     = shift;
1183     my $val      = shift;
1184     my $instance = shift;
1185
1186     return $val unless $self->has_type_constraint;
1187
1188     $val = $self->type_constraint->coerce($val)
1189         if $self->should_coerce && $self->type_constraint->has_coercion;
1190
1191     $self->verify_against_type_constraint($val, instance => $instance);
1192
1193     return $val;
1194 }
1195
1196 sub verify_against_type_constraint {
1197     my $self = shift;
1198     my $val  = shift;
1199
1200     return 1 if !$self->has_type_constraint;
1201
1202     my $type_constraint = $self->type_constraint;
1203
1204     $type_constraint->check($val)
1205         || $self->throw_error("Attribute ("
1206                  . $self->name
1207                  . ") does not pass the type constraint because: "
1208                  . $type_constraint->get_message($val), data => $val, @_);
1209 }
1210
1211 package Moose::Meta::Attribute::Custom::Moose;
1212 sub register_implementation { 'Moose::Meta::Attribute' }
1213
1214 1;
1215
1216 # ABSTRACT: The Moose attribute metaclass
1217
1218 __END__
1219
1220 =pod
1221
1222 =head1 DESCRIPTION
1223
1224 This class is a subclass of L<Class::MOP::Attribute> that provides
1225 additional Moose-specific functionality.
1226
1227 To really understand this class, you will need to start with the
1228 L<Class::MOP::Attribute> documentation. This class can be understood
1229 as a set of additional features on top of the basic feature provided
1230 by that parent class.
1231
1232 =head1 INHERITANCE
1233
1234 C<Moose::Meta::Attribute> is a subclass of L<Class::MOP::Attribute>.
1235
1236 =head1 METHODS
1237
1238 Many of the documented below override methods in
1239 L<Class::MOP::Attribute> and add Moose specific features.
1240
1241 =head2 Creation
1242
1243 =over 4
1244
1245 =item B<< Moose::Meta::Attribute->new(%options) >>
1246
1247 This method overrides the L<Class::MOP::Attribute> constructor.
1248
1249 Many of the options below are described in more detail in the
1250 L<Moose::Manual::Attributes> document.
1251
1252 It adds the following options to the constructor:
1253
1254 =over 8
1255
1256 =item * is => 'ro', 'rw', 'bare'
1257
1258 This provides a shorthand for specifying the C<reader>, C<writer>, or
1259 C<accessor> names. If the attribute is read-only ('ro') then it will
1260 have a C<reader> method with the same attribute as the name.
1261
1262 If it is read-write ('rw') then it will have an C<accessor> method
1263 with the same name. If you provide an explicit C<writer> for a
1264 read-write attribute, then you will have a C<reader> with the same
1265 name as the attribute, and a C<writer> with the name you provided.
1266
1267 Use 'bare' when you are deliberately not installing any methods
1268 (accessor, reader, etc.) associated with this attribute; otherwise,
1269 Moose will issue a deprecation warning when this attribute is added to a
1270 metaclass.
1271
1272 =item * isa => $type
1273
1274 This option accepts a type. The type can be a string, which should be
1275 a type name. If the type name is unknown, it is assumed to be a class
1276 name.
1277
1278 This option can also accept a L<Moose::Meta::TypeConstraint> object.
1279
1280 If you I<also> provide a C<does> option, then your C<isa> option must
1281 be a class name, and that class must do the role specified with
1282 C<does>.
1283
1284 =item * does => $role
1285
1286 This is short-hand for saying that the attribute's type must be an
1287 object which does the named role.
1288
1289 =item * coerce => $bool
1290
1291 This option is only valid for objects with a type constraint
1292 (C<isa>) that defined a coercion. If this is true, then coercions will be applied whenever
1293 this attribute is set.
1294
1295 You can make both this and the C<weak_ref> option true.
1296
1297 =item * trigger => $sub
1298
1299 This option accepts a subroutine reference, which will be called after
1300 the attribute is set.
1301
1302 =item * required => $bool
1303
1304 An attribute which is required must be provided to the constructor. An
1305 attribute which is required can also have a C<default> or C<builder>,
1306 which will satisfy its required-ness.
1307
1308 A required attribute must have a C<default>, C<builder> or a
1309 non-C<undef> C<init_arg>
1310
1311 =item * lazy => $bool
1312
1313 A lazy attribute must have a C<default> or C<builder>. When an
1314 attribute is lazy, the default value will not be calculated until the
1315 attribute is read.
1316
1317 =item * weak_ref => $bool
1318
1319 If this is true, the attribute's value will be stored as a weak
1320 reference.
1321
1322 =item * auto_deref => $bool
1323
1324 If this is true, then the reader will dereference the value when it is
1325 called. The attribute must have a type constraint which defines the
1326 attribute as an array or hash reference.
1327
1328 =item * lazy_build => $bool
1329
1330 Setting this to true makes the attribute lazy and provides a number of
1331 default methods.
1332
1333   has 'size' => (
1334       is         => 'ro',
1335       lazy_build => 1,
1336   );
1337
1338 is equivalent to this:
1339
1340   has 'size' => (
1341       is        => 'ro',
1342       lazy      => 1,
1343       builder   => '_build_size',
1344       clearer   => 'clear_size',
1345       predicate => 'has_size',
1346   );
1347
1348
1349 If your attribute name starts with an underscore (C<_>), then the clearer
1350 and predicate will as well:
1351
1352   has '_size' => (
1353       is         => 'ro',
1354       lazy_build => 1,
1355   );
1356
1357 becomes:
1358
1359   has '_size' => (
1360       is        => 'ro',
1361       lazy      => 1,
1362       builder   => '_build__size',
1363       clearer   => '_clear_size',
1364       predicate => '_has_size',
1365   );
1366
1367 Note the doubled underscore in the builder name. Internally, Moose
1368 simply prepends the attribute name with "_build_" to come up with the
1369 builder name.
1370
1371 =item * documentation
1372
1373 An arbitrary string that can be retrieved later by calling C<<
1374 $attr->documentation >>.
1375
1376 =back
1377
1378 =item B<< $attr->clone(%options) >>
1379
1380 This creates a new attribute based on attribute being cloned. You must
1381 supply a C<name> option to provide a new name for the attribute.
1382
1383 The C<%options> can only specify options handled by
1384 L<Class::MOP::Attribute>.
1385
1386 =back
1387
1388 =head2 Value management
1389
1390 =over 4
1391
1392 =item B<< $attr->initialize_instance_slot($meta_instance, $instance, $params) >>
1393
1394 This method is used internally to initialize the attribute's slot in
1395 the object C<$instance>.
1396
1397 This overrides the L<Class::MOP::Attribute> method to handle lazy
1398 attributes, weak references, and type constraints.
1399
1400 =item B<get_value>
1401
1402 =item B<set_value>
1403
1404   eval { $point->meta->get_attribute('x')->set_value($point, 'forty-two') };
1405   if($@) {
1406     print "Oops: $@\n";
1407   }
1408
1409 I<Attribute (x) does not pass the type constraint (Int) with 'forty-two'>
1410
1411 Before setting the value, a check is made on the type constraint of
1412 the attribute, if it has one, to see if the value passes it. If the
1413 value fails to pass, the set operation dies with a L</throw_error>.
1414
1415 Any coercion to convert values is done before checking the type constraint.
1416
1417 To check a value against a type constraint before setting it, fetch the
1418 attribute instance using L<Class::MOP::Class/find_attribute_by_name>,
1419 fetch the type_constraint from the attribute using L<Moose::Meta::Attribute/type_constraint>
1420 and call L<Moose::Meta::TypeConstraint/check>. See L<Moose::Cookbook::Basics::Recipe4>
1421 for an example.
1422
1423 =back
1424
1425 =head2 Attribute Accessor generation
1426
1427 =over 4
1428
1429 =item B<< $attr->install_accessors >>
1430
1431 This method overrides the parent to also install delegation methods.
1432
1433 If, after installing all methods, the attribute object has no associated
1434 methods, it throws an error unless C<< is => 'bare' >> was passed to the
1435 attribute constructor.  (Trying to add an attribute that has no associated
1436 methods is almost always an error.)
1437
1438 =item B<< $attr->remove_accessors >>
1439
1440 This method overrides the parent to also remove delegation methods.
1441
1442 =item B<< $attr->inline_set($instance_var, $value_var) >>
1443
1444 This method return a code snippet suitable for inlining the relevant
1445 operation. It expect strings containing variable names to be used in the
1446 inlining, like C<'$self'> or C<'$_[1]'>.
1447
1448 =item B<< $attr->install_delegation >>
1449
1450 This method adds its delegation methods to the attribute's associated
1451 class, if it has any to add.
1452
1453 =item B<< $attr->remove_delegation >>
1454
1455 This method remove its delegation methods from the attribute's
1456 associated class.
1457
1458 =item B<< $attr->accessor_metaclass >>
1459
1460 Returns the accessor metaclass name, which defaults to
1461 L<Moose::Meta::Method::Accessor>.
1462
1463 =item B<< $attr->delegation_metaclass >>
1464
1465 Returns the delegation metaclass name, which defaults to
1466 L<Moose::Meta::Method::Delegation>.
1467
1468 =back
1469
1470 =head2 Additional Moose features
1471
1472 These methods are not found in the superclass. They support features
1473 provided by Moose.
1474
1475 =over 4
1476
1477 =item B<< $attr->does($role) >>
1478
1479 This indicates whether the I<attribute itself> does the given
1480 role. The role can be given as a full class name, or as a resolvable
1481 trait name.
1482
1483 Note that this checks the attribute itself, not its type constraint,
1484 so it is checking the attribute's metaclass and any traits applied to
1485 the attribute.
1486
1487 =item B<< Moose::Meta::Class->interpolate_class_and_new($name, %options) >>
1488
1489 This is an alternate constructor that handles the C<metaclass> and
1490 C<traits> options.
1491
1492 Effectively, this method is a factory that finds or creates the
1493 appropriate class for the given C<metaclass> and/or C<traits>.
1494
1495 Once it has the appropriate class, it will call C<< $class->new($name,
1496 %options) >> on that class.
1497
1498 =item B<< $attr->clone_and_inherit_options(%options) >>
1499
1500 This method supports the C<has '+foo'> feature. It does various bits
1501 of processing on the supplied C<%options> before ultimately calling
1502 the C<clone> method.
1503
1504 One of its main tasks is to make sure that the C<%options> provided
1505 does not include the options returned by the
1506 C<illegal_options_for_inheritance> method.
1507
1508 =item B<< $attr->illegal_options_for_inheritance >>
1509
1510 This returns a blacklist of options that can not be overridden in a
1511 subclass's attribute definition.
1512
1513 This exists to allow a custom metaclass to change or add to the list
1514 of options which can not be changed.
1515
1516 =item B<< $attr->type_constraint >>
1517
1518 Returns the L<Moose::Meta::TypeConstraint> object for this attribute,
1519 if it has one.
1520
1521 =item B<< $attr->has_type_constraint >>
1522
1523 Returns true if this attribute has a type constraint.
1524
1525 =item B<< $attr->verify_against_type_constraint($value) >>
1526
1527 Given a value, this method returns true if the value is valid for the
1528 attribute's type constraint. If the value is not valid, it throws an
1529 error.
1530
1531 =item B<< $attr->handles >>
1532
1533 This returns the value of the C<handles> option passed to the
1534 constructor.
1535
1536 =item B<< $attr->has_handles >>
1537
1538 Returns true if this attribute performs delegation.
1539
1540 =item B<< $attr->is_weak_ref >>
1541
1542 Returns true if this attribute stores its value as a weak reference.
1543
1544 =item B<< $attr->is_required >>
1545
1546 Returns true if this attribute is required to have a value.
1547
1548 =item B<< $attr->is_lazy >>
1549
1550 Returns true if this attribute is lazy.
1551
1552 =item B<< $attr->is_lazy_build >>
1553
1554 Returns true if the C<lazy_build> option was true when passed to the
1555 constructor.
1556
1557 =item B<< $attr->should_coerce >>
1558
1559 Returns true if the C<coerce> option passed to the constructor was
1560 true.
1561
1562 =item B<< $attr->should_auto_deref >>
1563
1564 Returns true if the C<auto_deref> option passed to the constructor was
1565 true.
1566
1567 =item B<< $attr->trigger >>
1568
1569 This is the subroutine reference that was in the C<trigger> option
1570 passed to the constructor, if any.
1571
1572 =item B<< $attr->has_trigger >>
1573
1574 Returns true if this attribute has a trigger set.
1575
1576 =item B<< $attr->documentation >>
1577
1578 Returns the value that was in the C<documentation> option passed to
1579 the constructor, if any.
1580
1581 =item B<< $attr->has_documentation >>
1582
1583 Returns true if this attribute has any documentation.
1584
1585 =item B<< $attr->applied_traits >>
1586
1587 This returns an array reference of all the traits which were applied
1588 to this attribute. If none were applied, this returns C<undef>.
1589
1590 =item B<< $attr->has_applied_traits >>
1591
1592 Returns true if this attribute has any traits applied.
1593
1594 =back
1595
1596 =head1 BUGS
1597
1598 See L<Moose/BUGS> for details on reporting bugs.
1599
1600 =cut