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