d4b62d7e3c2b640d47706345a84169cea09f5b7e
[gitmo/Class-MOP.git] / lib / Class / MOP / Attribute.pm
1
2 package Class::MOP::Attribute;
3
4 use strict;
5 use warnings;
6
7 use Class::MOP::Method::Accessor;
8
9 use Carp         'confess';
10 use Scalar::Util 'blessed', 'weaken';
11 use Try::Tiny;
12
13 our $VERSION   = '1.12';
14 $VERSION = eval $VERSION;
15 our $AUTHORITY = 'cpan:STEVAN';
16
17 use base 'Class::MOP::Object', 'Class::MOP::Mixin::AttributeCore';
18
19 # NOTE: (meta-circularity)
20 # This method will be replaced in the
21 # boostrap section of Class::MOP, by
22 # a new version which uses the
23 # &Class::MOP::Class::construct_instance
24 # method to build an attribute meta-object
25 # which itself is described with attribute
26 # meta-objects.
27 #     - Ain't meta-circularity grand? :)
28 sub new {
29     my ( $class, @args ) = @_;
30
31     unshift @args, "name" if @args % 2 == 1;
32     my %options = @args;
33
34     my $name = $options{name};
35
36     (defined $name)
37         || confess "You must provide a name for the attribute";
38
39     $options{init_arg} = $name
40         if not exists $options{init_arg};
41     if(exists $options{builder}){
42         confess("builder must be a defined scalar value which is a method name")
43             if ref $options{builder} || !(defined $options{builder});
44         confess("Setting both default and builder is not allowed.")
45             if exists $options{default};
46     } else {
47         ($class->is_default_a_coderef(\%options))
48             || confess("References are not allowed as default values, you must ".
49                        "wrap the default of '$name' in a CODE reference (ex: sub { [] } and not [])")
50                 if exists $options{default} && ref $options{default};
51     }
52     if( $options{required} and not( defined($options{builder}) || defined($options{init_arg}) || exists $options{default} ) ) {
53         confess("A required attribute must have either 'init_arg', 'builder', or 'default'");
54     }
55
56     $class->_new(\%options);
57 }
58
59 sub _new {
60     my $class = shift;
61
62     return Class::MOP::Class->initialize($class)->new_object(@_)
63         if $class ne __PACKAGE__;
64
65     my $options = @_ == 1 ? $_[0] : {@_};
66
67     bless {
68         'name'               => $options->{name},
69         'accessor'           => $options->{accessor},
70         'reader'             => $options->{reader},
71         'writer'             => $options->{writer},
72         'predicate'          => $options->{predicate},
73         'clearer'            => $options->{clearer},
74         'builder'            => $options->{builder},
75         'init_arg'           => $options->{init_arg},
76         exists $options->{default}
77             ? ('default'     => $options->{default})
78             : (),
79         'initializer'        => $options->{initializer},
80         'definition_context' => $options->{definition_context},
81         # keep a weakened link to the
82         # class we are associated with
83         'associated_class' => undef,
84         # and a list of the methods
85         # associated with this attr
86         'associated_methods' => [],
87         # this let's us keep track of
88         # our order inside the associated
89         # class
90         'insertion_order'    => undef,
91     }, $class;
92 }
93
94 # NOTE:
95 # this is a primative (and kludgy) clone operation
96 # for now, it will be replaced in the Class::MOP
97 # bootstrap with a proper one, however we know
98 # that this one will work fine for now.
99 sub clone {
100     my $self    = shift;
101     my %options = @_;
102     (blessed($self))
103         || confess "Can only clone an instance";
104     return bless { %{$self}, %options } => ref($self);
105 }
106
107 sub initialize_instance_slot {
108     my ($self, $meta_instance, $instance, $params) = @_;
109     my $init_arg = $self->{'init_arg'};
110
111     # try to fetch the init arg from the %params ...
112
113     # if nothing was in the %params, we can use the
114     # attribute's default value (if it has one)
115     if(defined $init_arg and exists $params->{$init_arg}){
116         $self->_set_initial_slot_value(
117             $meta_instance, 
118             $instance,
119             $params->{$init_arg},
120         );
121     } 
122     elsif (exists $self->{'default'}) {
123         $self->_set_initial_slot_value(
124             $meta_instance, 
125             $instance,
126             $self->default($instance),
127         );
128     } 
129     elsif (defined( my $builder = $self->{'builder'})) {
130         if ($builder = $instance->can($builder)) {
131             $self->_set_initial_slot_value(
132                 $meta_instance, 
133                 $instance,
134                 $instance->$builder,
135             );
136         } 
137         else {
138             confess(ref($instance)." does not support builder method '". $self->{'builder'} ."' for attribute '" . $self->name . "'");
139         }
140     }
141 }
142
143 sub _set_initial_slot_value {
144     my ($self, $meta_instance, $instance, $value) = @_;
145
146     my $slot_name = $self->name;
147
148     return $meta_instance->set_slot_value($instance, $slot_name, $value)
149         unless $self->has_initializer;
150
151     my $callback = sub {
152         $meta_instance->set_slot_value($instance, $slot_name, $_[0]);
153     };
154     
155     my $initializer = $self->initializer;
156
157     # most things will just want to set a value, so make it first arg
158     $instance->$initializer($value, $callback, $self);
159 }
160
161 sub associated_class   { $_[0]->{'associated_class'}   }
162 sub associated_methods { $_[0]->{'associated_methods'} }
163
164 sub get_read_method  { 
165     my $self   = shift;    
166     my $reader = $self->reader || $self->accessor;
167     # normal case ...
168     return $reader unless ref $reader;
169     # the HASH ref case
170     my ($name) = %$reader;
171     return $name;
172 }
173
174 sub get_write_method { 
175     my $self   = shift;
176     my $writer = $self->writer || $self->accessor; 
177     # normal case ...
178     return $writer unless ref $writer;
179     # the HASH ref case
180     my ($name) = %$writer;
181     return $name;    
182 }
183
184 sub get_read_method_ref {
185     my $self = shift;
186     if ((my $reader = $self->get_read_method) && $self->associated_class) {   
187         return $self->associated_class->get_method($reader);
188     }
189     else {
190         my $code = sub { $self->get_value(@_) };
191         if (my $class = $self->associated_class) {
192             return $class->method_metaclass->wrap(
193                 $code,
194                 package_name => $class->name,
195                 name         => '__ANON__'
196             );
197         }
198         else {
199             return $code;
200         }
201     }
202 }
203
204 sub get_write_method_ref {
205     my $self = shift;    
206     if ((my $writer = $self->get_write_method) && $self->associated_class) {         
207         return $self->associated_class->get_method($writer);
208     }
209     else {
210         my $code = sub { $self->set_value(@_) };
211         if (my $class = $self->associated_class) {
212             return $class->method_metaclass->wrap(
213                 $code,
214                 package_name => $class->name,
215                 name         => '__ANON__'
216             );
217         }
218         else {
219             return $code;
220         }
221     }
222 }
223
224 # slots
225
226 sub slots { (shift)->name }
227
228 # class association
229
230 sub attach_to_class {
231     my ($self, $class) = @_;
232     (blessed($class) && $class->isa('Class::MOP::Class'))
233         || confess "You must pass a Class::MOP::Class instance (or a subclass)";
234     weaken($self->{'associated_class'} = $class);
235 }
236
237 sub detach_from_class {
238     my $self = shift;
239     $self->{'associated_class'} = undef;
240 }
241
242 # method association
243
244 sub associate_method {
245     my ($self, $method) = @_;
246     push @{$self->{'associated_methods'}} => $method;
247 }
248
249 ## Slot management
250
251 sub set_initial_value {
252     my ($self, $instance, $value) = @_;
253     $self->_set_initial_slot_value(
254         Class::MOP::Class->initialize(ref($instance))->get_meta_instance,
255         $instance,
256         $value
257     );
258 }
259
260 sub set_value { shift->set_raw_value(@_) }
261 sub get_value { shift->get_raw_value(@_) }
262
263 sub set_raw_value {
264     my ($self, $instance, $value) = @_;
265
266     Class::MOP::Class->initialize(ref($instance))
267                      ->get_meta_instance
268                      ->set_slot_value($instance, $self->name, $value);
269 }
270
271 sub get_raw_value {
272     my ($self, $instance) = @_;
273
274     Class::MOP::Class->initialize(ref($instance))
275                      ->get_meta_instance
276                      ->get_slot_value($instance, $self->name);
277 }
278
279 sub has_value {
280     my ($self, $instance) = @_;
281
282     Class::MOP::Class->initialize(ref($instance))
283                      ->get_meta_instance
284                      ->is_slot_initialized($instance, $self->name);
285 }
286
287 sub clear_value {
288     my ($self, $instance) = @_;
289
290     Class::MOP::Class->initialize(ref($instance))
291                      ->get_meta_instance
292                      ->deinitialize_slot($instance, $self->name);
293 }
294
295 ## load em up ...
296
297 sub accessor_metaclass { 'Class::MOP::Method::Accessor' }
298
299 sub _process_accessors {
300     my ($self, $type, $accessor, $generate_as_inline_methods) = @_;
301
302     my $method_ctx;
303
304     if ( my $ctx = $self->definition_context ) {
305         $method_ctx = { %$ctx };
306     }
307
308     if (ref($accessor)) {
309         (ref($accessor) eq 'HASH')
310             || confess "bad accessor/reader/writer/predicate/clearer format, must be a HASH ref";
311         my ($name, $method) = %{$accessor};
312         $method = $self->accessor_metaclass->wrap(
313             $method,
314             package_name => $self->associated_class->name,
315             name         => $name,
316             definition_context => $method_ctx,
317         );
318         $self->associate_method($method);
319         return ($name, $method);
320     }
321     else {
322         my $inline_me = ($generate_as_inline_methods && $self->associated_class->instance_metaclass->is_inlinable);
323         my $method;
324         try {
325             if ( $method_ctx ) {
326                 my $desc = "accessor $accessor";
327                 if ( $accessor ne $self->name ) {
328                     $desc .= " of attribute " . $self->name;
329                 }
330
331                 $method_ctx->{description} = $desc;
332             }
333
334             $method = $self->accessor_metaclass->new(
335                 attribute     => $self,
336                 is_inline     => $inline_me,
337                 accessor_type => $type,
338                 package_name  => $self->associated_class->name,
339                 name          => $accessor,
340                 definition_context => $method_ctx,
341             );
342         }
343         catch {
344             confess "Could not create the '$type' method for " . $self->name . " because : $_";
345         };
346         $self->associate_method($method);
347         return ($accessor, $method);
348     }
349 }
350
351 sub install_accessors {
352     my $self   = shift;
353     my $inline = shift;
354     my $class  = $self->associated_class;
355
356     $class->add_method(
357         $self->_process_accessors('accessor' => $self->accessor(), $inline)
358     ) if $self->has_accessor();
359
360     $class->add_method(
361         $self->_process_accessors('reader' => $self->reader(), $inline)
362     ) if $self->has_reader();
363
364     $class->add_method(
365         $self->_process_accessors('writer' => $self->writer(), $inline)
366     ) if $self->has_writer();
367
368     $class->add_method(
369         $self->_process_accessors('predicate' => $self->predicate(), $inline)
370     ) if $self->has_predicate();
371
372     $class->add_method(
373         $self->_process_accessors('clearer' => $self->clearer(), $inline)
374     ) if $self->has_clearer();
375
376     return;
377 }
378
379 {
380     my $_remove_accessor = sub {
381         my ($accessor, $class) = @_;
382         if (ref($accessor) && ref($accessor) eq 'HASH') {
383             ($accessor) = keys %{$accessor};
384         }
385         my $method = $class->get_method($accessor);
386         $class->remove_method($accessor)
387             if (ref($method) && $method->isa('Class::MOP::Method::Accessor'));
388     };
389
390     sub remove_accessors {
391         my $self = shift;
392         # TODO:
393         # we really need to make sure to remove from the
394         # associates methods here as well. But this is
395         # such a slimly used method, I am not worried
396         # about it right now.
397         $_remove_accessor->($self->accessor(),  $self->associated_class()) if $self->has_accessor();
398         $_remove_accessor->($self->reader(),    $self->associated_class()) if $self->has_reader();
399         $_remove_accessor->($self->writer(),    $self->associated_class()) if $self->has_writer();
400         $_remove_accessor->($self->predicate(), $self->associated_class()) if $self->has_predicate();
401         $_remove_accessor->($self->clearer(),   $self->associated_class()) if $self->has_clearer();
402         return;
403     }
404
405 }
406
407 sub inline_get {
408     my $self = shift;
409     my ($instance) = @_;
410
411     return $self->associated_class->get_meta_instance->inline_get_slot_value(
412         $instance, $self->name );
413 }
414
415 sub inline_set {
416     my $self = shift;
417     my ( $instance, $value ) = @_;
418
419     return $self->associated_class->get_meta_instance->inline_set_slot_value(
420         $instance, $self->name, $value );
421 }
422
423 sub inline_has {
424     my $self = shift;
425     my ($instance) = @_;
426
427     return
428         $self->associated_class->get_meta_instance
429         ->inline_is_slot_initialized( $instance, $self->name );
430 }
431
432 sub inline_clear {
433     my $self = shift;
434     my ($instance) = @_;
435
436     return
437         $self->associated_class->get_meta_instance
438         ->inline_deinitialize_slot( $instance, $self->name );
439 }
440
441 1;
442
443 __END__
444
445 =pod
446
447 =head1 NAME
448
449 Class::MOP::Attribute - Attribute Meta Object
450
451 =head1 SYNOPSIS
452
453   Class::MOP::Attribute->new(
454       foo => (
455           accessor  => 'foo',           # dual purpose get/set accessor
456           predicate => 'has_foo',       # predicate check for defined-ness
457           init_arg  => '-foo',          # class->new will look for a -foo key
458           default   => 'BAR IS BAZ!'    # if no -foo key is provided, use this
459       )
460   );
461
462   Class::MOP::Attribute->new(
463       bar => (
464           reader    => 'bar',           # getter
465           writer    => 'set_bar',       # setter
466           predicate => 'has_bar',       # predicate check for defined-ness
467           init_arg  => ':bar',          # class->new will look for a :bar key
468                                         # no default value means it is undef
469       )
470   );
471
472 =head1 DESCRIPTION
473
474 The Attribute Protocol is almost entirely an invention of
475 C<Class::MOP>. Perl 5 does not have a consistent notion of
476 attributes. There are so many ways in which this is done, and very few
477 (if any) are easily discoverable by this module.
478
479 With that said, this module attempts to inject some order into this
480 chaos, by introducing a consistent API which can be used to create
481 object attributes.
482
483 =head1 METHODS
484
485 =head2 Creation
486
487 =over 4
488
489 =item B<< Class::MOP::Attribute->new($name, ?%options) >>
490
491 An attribute must (at the very least), have a C<$name>. All other
492 C<%options> are added as key-value pairs.
493
494 =over 8
495
496 =item * init_arg
497
498 This is a string value representing the expected key in an
499 initialization hash. For instance, if we have an C<init_arg> value of
500 C<-foo>, then the following code will Just Work.
501
502   MyClass->meta->new_object( -foo => 'Hello There' );
503
504 If an init_arg is not assigned, it will automatically use the
505 attribute's name. If C<init_arg> is explicitly set to C<undef>, the
506 attribute cannot be specified during initialization.
507
508 =item * builder
509
510 This provides the name of a method that will be called to initialize
511 the attribute. This method will be called on the object after it is
512 constructed. It is expected to return a valid value for the attribute.
513
514 =item * default
515
516 This can be used to provide an explicit default for initializing the
517 attribute. If the default you provide is a subroutine reference, then
518 this reference will be called I<as a method> on the object.
519
520 If the value is a simple scalar (string or number), then it can be
521 just passed as is. However, if you wish to initialize it with a HASH
522 or ARRAY ref, then you need to wrap that inside a subroutine
523 reference:
524
525   Class::MOP::Attribute->new(
526       'foo' => (
527           default => sub { [] },
528       )
529   );
530
531   # or ...
532
533   Class::MOP::Attribute->new(
534       'foo' => (
535           default => sub { {} },
536       )
537   );
538
539 If you wish to initialize an attribute with a subroutine reference
540 itself, then you need to wrap that in a subroutine as well:
541
542   Class::MOP::Attribute->new(
543       'foo' => (
544           default => sub {
545               sub { print "Hello World" }
546           },
547       )
548   );
549
550 And lastly, if the value of your attribute is dependent upon some
551 other aspect of the instance structure, then you can take advantage of
552 the fact that when the C<default> value is called as a method:
553
554   Class::MOP::Attribute->new(
555       'object_identity' => (
556           default => sub { Scalar::Util::refaddr( $_[0] ) },
557       )
558   );
559
560 Note that there is no guarantee that attributes are initialized in any
561 particular order, so you cannot rely on the value of some other
562 attribute when generating the default.
563
564 =item * initializer
565
566 This option can be either a method name or a subroutine
567 reference. This method will be called when setting the attribute's
568 value in the constructor. Unlike C<default> and C<builder>, the
569 initializer is only called when a value is provided to the
570 constructor. The initializer allows you to munge this value during
571 object construction.
572
573 The initializer is called as a method with three arguments. The first
574 is the value that was passed to the constructor. The second is a
575 subroutine reference that can be called to actually set the
576 attribute's value, and the last is the associated
577 C<Class::MOP::Attribute> object.
578
579 This contrived example shows an initializer that sets the attribute to
580 twice the given value.
581
582   Class::MOP::Attribute->new(
583       'doubled' => (
584           initializer => sub {
585               my ( $self, $value, $set, $attr ) = @_;
586               $set->( $value * 2 );
587           },
588       )
589   );
590
591 Since an initializer can be a method name, you can easily make
592 attribute initialization use the writer:
593
594   Class::MOP::Attribute->new(
595       'some_attr' => (
596           writer      => 'some_attr',
597           initializer => 'some_attr',
598       )
599   );
600
601 Your writer will need to examine C<@_> and determine under which
602 context it is being called.
603
604 =back
605
606 The C<accessor>, C<reader>, C<writer>, C<predicate> and C<clearer>
607 options all accept the same parameters. You can provide the name of
608 the method, in which case an appropriate default method will be
609 generated for you. Or instead you can also provide hash reference
610 containing exactly one key (the method name) and one value. The value
611 should be a subroutine reference, which will be installed as the
612 method itself.
613
614 =over 8
615
616 =item * accessor
617
618 An C<accessor> is a standard Perl-style read/write accessor. It will
619 return the value of the attribute, and if a value is passed as an
620 argument, it will assign that value to the attribute.
621
622 Note that C<undef> is a legitimate value, so this will work:
623
624   $object->set_something(undef);
625
626 =item * reader
627
628 This is a basic read-only accessor. It returns the value of the
629 attribute.
630
631 =item * writer
632
633 This is a basic write accessor, it accepts a single argument, and
634 assigns that value to the attribute.
635
636 Note that C<undef> is a legitimate value, so this will work:
637
638   $object->set_something(undef);
639
640 =item * predicate
641
642 The predicate method returns a boolean indicating whether or not the
643 attribute has been explicitly set.
644
645 Note that the predicate returns true even if the attribute was set to
646 a false value (C<0> or C<undef>).
647
648 =item * clearer
649
650 This method will uninitialize the attribute. After an attribute is
651 cleared, its C<predicate> will return false.
652
653 =item * definition_context
654
655 Mostly, this exists as a hook for the benefit of Moose.
656
657 This option should be a hash reference containing several keys which
658 will be used when inlining the attribute's accessors. The keys should
659 include C<line>, the line number where the attribute was created, and
660 either C<file> or C<description>.
661
662 This information will ultimately be used when eval'ing inlined
663 accessor code so that error messages report a useful line and file
664 name.
665
666 =back
667
668 =item B<< $attr->clone(%options) >>
669
670 This clones the attribute. Any options you provide will override the
671 settings of the original attribute. You can change the name of the new
672 attribute by passing a C<name> key in C<%options>.
673
674 =back
675
676 =head2 Informational
677
678 These are all basic read-only accessors for the values passed into
679 the constructor.
680
681 =over 4
682
683 =item B<< $attr->name >>
684
685 Returns the attribute's name.
686
687 =item B<< $attr->accessor >>
688
689 =item B<< $attr->reader >>
690
691 =item B<< $attr->writer >>
692
693 =item B<< $attr->predicate >>
694
695 =item B<< $attr->clearer >>
696
697 The C<accessor>, C<reader>, C<writer>, C<predicate>, and C<clearer>
698 methods all return exactly what was passed to the constructor, so it
699 can be either a string containing a method name, or a hash reference.
700
701 =item B<< $attr->initializer >>
702
703 Returns the initializer as passed to the constructor, so this may be
704 either a method name or a subroutine reference.
705
706 =item B<< $attr->init_arg >>
707
708 =item B<< $attr->is_default_a_coderef >>
709
710 =item B<< $attr->default($instance) >>
711
712 The C<$instance> argument is optional. If you don't pass it, the
713 return value for this method is exactly what was passed to the
714 constructor, either a simple scalar or a subroutine reference.
715
716 If you I<do> pass an C<$instance> and the default is a subroutine
717 reference, then the reference is called as a method on the
718 C<$instance> and the generated value is returned.
719
720 =item B<< $attr->slots >>
721
722 Return a list of slots required by the attribute. This is usually just
723 one, the name of the attribute.
724
725 A slot is the name of the hash key used to store the attribute in an
726 object instance.
727
728 =item B<< $attr->get_read_method >>
729
730 =item B<< $attr->get_write_method >>
731
732 Returns the name of a method suitable for reading or writing the value
733 of the attribute in the associated class.
734
735 If an attribute is read- or write-only, then these methods can return
736 C<undef> as appropriate.
737
738 =item B<< $attr->has_read_method >>
739
740 =item B<< $attr->has_write_method >>
741
742 This returns a boolean indicating whether the attribute has a I<named>
743 read or write method.
744
745 =item B<< $attr->get_read_method_ref >>
746
747 =item B<< $attr->get_write_method_ref >>
748
749 Returns the subroutine reference of a method suitable for reading or
750 writing the attribute's value in the associated class. These methods
751 always return a subroutine reference, regardless of whether or not the
752 attribute is read- or write-only.
753
754 =item B<< $attr->insertion_order >>
755
756 If this attribute has been inserted into a class, this returns a zero
757 based index regarding the order of insertion.
758
759 =back
760
761 =head2 Informational predicates
762
763 These are all basic predicate methods for the values passed into C<new>.
764
765 =over 4
766
767 =item B<< $attr->has_accessor >>
768
769 =item B<< $attr->has_reader >>
770
771 =item B<< $attr->has_writer >>
772
773 =item B<< $attr->has_predicate >>
774
775 =item B<< $attr->has_clearer >>
776
777 =item B<< $attr->has_initializer >>
778
779 =item B<< $attr->has_init_arg >>
780
781 This will be I<false> if the C<init_arg> was set to C<undef>.
782
783 =item B<< $attr->has_default >>
784
785 This will be I<false> if the C<default> was set to C<undef>, since
786 C<undef> is the default C<default> anyway.
787
788 =item B<< $attr->has_builder >>
789
790 =item B<< $attr->has_insertion_order >>
791
792 This will be I<false> if this attribute has not be inserted into a class
793
794 =back
795
796 =head2 Value management
797
798 These methods are basically "back doors" to the instance, and can be
799 used to bypass the regular accessors, but still stay within the MOP.
800
801 These methods are not for general use, and should only be used if you
802 really know what you are doing.
803
804 =over 4
805
806 =item B<< $attr->initialize_instance_slot($meta_instance, $instance, $params) >>
807
808 This method is used internally to initialize the attribute's slot in
809 the object C<$instance>.
810
811 The C<$params> is a hash reference of the values passed to the object
812 constructor.
813
814 It's unlikely that you'll need to call this method yourself.
815
816 =item B<< $attr->set_value($instance, $value) >>
817
818 Sets the value without going through the accessor. Note that this
819 works even with read-only attributes.
820
821 =item B<< $attr->set_raw_value($instance, $value) >>
822
823 Sets the value with no side effects such as a trigger.
824
825 This doesn't actually apply to Class::MOP attributes, only to subclasses.
826
827 =item B<< $attr->set_initial_value($instance, $value) >>
828
829 Sets the value without going through the accessor. This method is only
830 called when the instance is first being initialized.
831
832 =item B<< $attr->get_value($instance) >>
833
834 Returns the value without going through the accessor. Note that this
835 works even with write-only accessors.
836
837 =item B<< $attr->get_raw_value($instance) >>
838
839 Returns the value without any side effects such as lazy attributes.
840
841 Doesn't actually apply to Class::MOP attributes, only to subclasses.
842
843 =item B<< $attr->has_value($instance) >>
844
845 Return a boolean indicating whether the attribute has been set in
846 C<$instance>. This how the default C<predicate> method works.
847
848 =item B<< $attr->clear_value($instance) >>
849
850 This will clear the attribute's value in C<$instance>. This is what
851 the default C<clearer> calls.
852
853 Note that this works even if the attribute does not have any
854 associated read, write or clear methods.
855
856 =back
857
858 =head2 Class association
859
860 These methods allow you to manage the attributes association with
861 the class that contains it. These methods should not be used
862 lightly, nor are they very magical, they are mostly used internally
863 and by metaclass instances.
864
865 =over 4
866
867 =item B<< $attr->associated_class >>
868
869 This returns the C<Class::MOP::Class> with which this attribute is
870 associated, if any.
871
872 =item B<< $attr->attach_to_class($metaclass) >>
873
874 This method stores a weakened reference to the C<$metaclass> object
875 internally.
876
877 This method does not remove the attribute from its old class,
878 nor does it create any accessors in the new class.
879
880 It is probably best to use the L<Class::MOP::Class> C<add_attribute>
881 method instead.
882
883 =item B<< $attr->detach_from_class >>
884
885 This method removes the associate metaclass object from the attribute
886 it has one.
887
888 This method does not remove the attribute itself from the class, or
889 remove its accessors.
890
891 It is probably best to use the L<Class::MOP::Class>
892 C<remove_attribute> method instead.
893
894 =back
895
896 =head2 Attribute Accessor generation
897
898 =over 4
899
900 =item B<< $attr->accessor_metaclass >>
901
902 Accessor methods are generated using an accessor metaclass. By
903 default, this is L<Class::MOP::Method::Accessor>. This method returns
904 the name of the accessor metaclass that this attribute uses.
905
906 =item B<< $attr->associate_method($method) >>
907
908 This associates a L<Class::MOP::Method> object with the
909 attribute. Typically, this is called internally when an attribute
910 generates its accessors.
911
912 =item B<< $attr->associated_methods >>
913
914 This returns the list of methods which have been associated with the
915 attribute.
916
917 =item B<< $attr->install_accessors >>
918
919 This method generates and installs code the attributes various
920 accessors. It is typically called from the L<Class::MOP::Class>
921 C<add_attribute> method.
922
923 =item B<< $attr->remove_accessors >>
924
925 This method removes all of the accessors associated with the
926 attribute.
927
928 This does not currently remove methods from the list returned by
929 C<associated_methods>.
930
931 =item B<< $attr->inline_get >>
932
933 =item B<< $attr->inline_set >>
934
935 =item B<< $attr->inline_has >>
936
937 =item B<< $attr->inline_clear >>
938
939 These methods return a code snippet suitable for inlining the relevant
940 operation. They expect strings containing variable names to be used in the
941 inlining, like C<'$self'> or C<'$_[1]'>.
942
943 =back
944
945 =head2 Introspection
946
947 =over 4
948
949 =item B<< Class::MOP::Attribute->meta >>
950
951 This will return a L<Class::MOP::Class> instance for this class.
952
953 It should also be noted that L<Class::MOP> will actually bootstrap
954 this module by installing a number of attribute meta-objects into its
955 metaclass.
956
957 =back
958
959 =head1 AUTHORS
960
961 Stevan Little E<lt>stevan@iinteractive.comE<gt>
962
963 =head1 COPYRIGHT AND LICENSE
964
965 Copyright 2006-2010 by Infinity Interactive, Inc.
966
967 L<http://www.iinteractive.com>
968
969 This library is free software; you can redistribute it and/or modify
970 it under the same terms as Perl itself.
971
972 =cut
973
974