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