bump version and update Changes
[gitmo/Class-MOP.git] / lib / Class / MOP / Method / Accessor.pm
index 1f8eb04..8870a1a 100644 (file)
@@ -7,69 +7,86 @@ use warnings;
 use Carp         'confess';
 use Scalar::Util 'blessed', 'weaken';
 
-our $VERSION   = '0.02';
+our $VERSION   = '0.85';
+$VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
-use base 'Class::MOP::Method';
+use base 'Class::MOP::Method::Generated';
 
 sub new {
     my $class   = shift;
     my %options = @_;
-    
+
     (exists $options{attribute})
         || confess "You must supply an attribute to construct with";
-        
+
     (exists $options{accessor_type})
-        || confess "You must supply an accessor_type to construct with"; 
-        
+        || confess "You must supply an accessor_type to construct with";
+
     (blessed($options{attribute}) && $options{attribute}->isa('Class::MOP::Attribute'))
-        || confess "You must supply an attribute which is a 'Class::MOP::Attribute' instance";    
-        
-    my $self = bless {
-        # from our superclass
-        body          => undef,
-        # specific to this subclass
-        attribute     => $options{attribute},
-        is_inline     => ($options{is_inline} || 0),
-        accessor_type => $options{accessor_type},        
-    } => $class;
-    
-    # we don't want this creating 
-    # a cycle in the code, if not 
+        || confess "You must supply an attribute which is a 'Class::MOP::Attribute' instance";
+
+    ($options{package_name} && $options{name})
+        || confess "You must supply the package_name and name parameters $Class::MOP::Method::UPGRADE_ERROR_TEXT";
+
+    my $self = $class->_new(\%options);
+
+    # we don't want this creating
+    # a cycle in the code, if not
     # needed
-    weaken($self->{attribute});
-    
-    $self->intialize_body;
-    
+    weaken($self->{'attribute'});
+
+    $self->_initialize_body;
+
     return $self;
 }
 
+sub _new {
+    my $class = shift;
+    my $options = @_ == 1 ? $_[0] : {@_};
+
+    $options->{is_inline} ||= 0;
+
+    return bless $options, $class;
+}
+
 ## accessors
 
-sub associated_attribute { (shift)->{attribute}     }
-sub accessor_type        { (shift)->{accessor_type} }
-sub is_inline            { (shift)->{is_inline}     }
+sub associated_attribute { (shift)->{'attribute'}     }
+sub accessor_type        { (shift)->{'accessor_type'} }
 
-## factory 
+## factory
 
-sub intialize_body {
+sub initialize_body {
+    Carp::cluck('The initialize_body method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
+    shift->_initialize_body;
+}
+
+sub _initialize_body {
     my $self = shift;
-    
+
     my $method_name = join "_" => (
-        'generate', 
-        $self->accessor_type, 
+        '_generate',
+        $self->accessor_type,
         'method',
         ($self->is_inline ? 'inline' : ())
     );
-    
-    eval { $self->{body} = $self->$method_name() };
+
+    eval { $self->{'body'} = $self->$method_name() };
     die $@ if $@;
 }
 
 ## generators
 
 sub generate_accessor_method {
-    my $attr = (shift)->associated_attribute; 
+    Carp::cluck('The generate_accessor_method method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
+    shift->_generate_accessor_method;
+}
+
+sub _generate_accessor_method {
+    my $attr = (shift)->associated_attribute;
     return sub {
         $attr->set_value($_[0], $_[1]) if scalar(@_) == 2;
         $attr->get_value($_[0]);
@@ -77,100 +94,173 @@ sub generate_accessor_method {
 }
 
 sub generate_reader_method {
-    my $attr = (shift)->associated_attribute; 
-    return sub { 
+    Carp::cluck('The generate_reader_method method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
+    shift->_generate_reader_method;
+}
+
+sub _generate_reader_method {
+    my $attr = (shift)->associated_attribute;
+    return sub {
         confess "Cannot assign a value to a read-only accessor" if @_ > 1;
         $attr->get_value($_[0]);
-    };   
+    };
 }
 
 sub generate_writer_method {
-    my $attr = (shift)->associated_attribute; 
+    Carp::cluck('The generate_writer_method method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
+    shift->_generate_writer_method;
+}
+
+sub _generate_writer_method {
+    my $attr = (shift)->associated_attribute;
     return sub {
         $attr->set_value($_[0], $_[1]);
     };
 }
 
 sub generate_predicate_method {
-    my $attr = (shift)->associated_attribute; 
-    return sub { 
+    Carp::cluck('The generate_predicate_method method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
+    shift->_generate_predicate_method;
+}
+
+sub _generate_predicate_method {
+    my $attr = (shift)->associated_attribute;
+    return sub {
         $attr->has_value($_[0])
     };
 }
 
 sub generate_clearer_method {
-    my $attr = (shift)->associated_attribute; 
-    return sub { 
+    Carp::cluck('The generate_clearer_method method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
+    shift->_generate_clearer_method;
+}
+
+sub _generate_clearer_method {
+    my $attr = (shift)->associated_attribute;
+    return sub {
         $attr->clear_value($_[0])
     };
 }
 
 ## Inline methods
 
-
 sub generate_accessor_method_inline {
-    my $attr          = (shift)->associated_attribute; 
+    Carp::cluck('The generate_accessor_method_inline method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
+    shift->_generate_accessor_method_inline;
+}
+
+sub _generate_accessor_method_inline {
+    my $self          = shift;
+    my $attr          = $self->associated_attribute;
     my $attr_name     = $attr->name;
     my $meta_instance = $attr->associated_class->instance_metaclass;
 
-    my $code = eval 'sub {'
-        . $meta_instance->inline_set_slot_value('$_[0]', "'$attr_name'", '$_[1]')  . ' if scalar(@_) == 2; '
-        . $meta_instance->inline_get_slot_value('$_[0]', "'$attr_name'")
-    . '}';
+    my $code = $self->_eval_closure(
+        {},
+        'sub {'
+        . $meta_instance->inline_set_slot_value('$_[0]', $attr_name, '$_[1]')
+        . ' if scalar(@_) == 2; '
+        . $meta_instance->inline_get_slot_value('$_[0]', $attr_name)
+        . '}'
+    );
     confess "Could not generate inline accessor because : $@" if $@;
 
     return $code;
 }
 
 sub generate_reader_method_inline {
-    my $attr          = (shift)->associated_attribute; 
+    Carp::cluck('The generate_reader_method_inline method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
+    shift->_generate_reader_method_inline;
+}
+
+sub _generate_reader_method_inline {
+    my $self          = shift;
+    my $attr          = $self->associated_attribute;
     my $attr_name     = $attr->name;
     my $meta_instance = $attr->associated_class->instance_metaclass;
 
-    my $code = eval 'sub {'
+     my $code = $self->_eval_closure(
+         {},
+        'sub {'
         . 'confess "Cannot assign a value to a read-only accessor" if @_ > 1;'
-        . $meta_instance->inline_get_slot_value('$_[0]', "'$attr_name'")
-    . '}';
-    confess "Could not generate inline accessor because : $@" if $@;
+        . $meta_instance->inline_get_slot_value('$_[0]', $attr_name)
+        . '}'
+    );
+    confess "Could not generate inline reader because : $@" if $@;
 
     return $code;
 }
 
 sub generate_writer_method_inline {
-    my $attr          = (shift)->associated_attribute; 
+    Carp::cluck('The generate_writer_method_inline method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
+    shift->_generate_writer_method_inline;
+}
+
+sub _generate_writer_method_inline {
+    my $self          = shift;
+    my $attr          = $self->associated_attribute;
     my $attr_name     = $attr->name;
     my $meta_instance = $attr->associated_class->instance_metaclass;
 
-    my $code = eval 'sub {'
-        . $meta_instance->inline_set_slot_value('$_[0]', "'$attr_name'", '$_[1]')
-    . '}';
-    confess "Could not generate inline accessor because : $@" if $@;
+    my $code = $self->_eval_closure(
+        {},
+        'sub {'
+        . $meta_instance->inline_set_slot_value('$_[0]', $attr_name, '$_[1]')
+        . '}'
+    );
+    confess "Could not generate inline writer because : $@" if $@;
 
     return $code;
 }
 
-
 sub generate_predicate_method_inline {
-    my $attr          = (shift)->associated_attribute; 
+    Carp::cluck('The generate_predicate_method_inline method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
+    shift->_generate_predicate_method_inline;
+}
+
+sub _generate_predicate_method_inline {
+    my $self          = shift;
+    my $attr          = $self->associated_attribute;
     my $attr_name     = $attr->name;
     my $meta_instance = $attr->associated_class->instance_metaclass;
 
-    my $code = eval 'sub {'
-        . 'defined ' . $meta_instance->inline_get_slot_value('$_[0]', "'$attr_name'") . ' ? 1 : 0'
-    . '}';
+    my $code = $self->_eval_closure(
+        {},
+       'sub {'
+       . $meta_instance->inline_is_slot_initialized('$_[0]', $attr_name)
+       . '}'
+    );
     confess "Could not generate inline predicate because : $@" if $@;
 
     return $code;
 }
 
 sub generate_clearer_method_inline {
-    my $attr          = (shift)->associated_attribute; 
+    Carp::cluck('The generate_clearer_method_inline method has been made private.'
+        . " The public version is deprecated and will be removed in a future release.\n");
+    shift->_generate_clearer_method_inline;
+}
+
+sub _generate_clearer_method_inline {
+    my $self          = shift;
+    my $attr          = $self->associated_attribute;
     my $attr_name     = $attr->name;
     my $meta_instance = $attr->associated_class->instance_metaclass;
 
-    my $code = eval 'sub {'
-        . $meta_instance->inline_deinitialize_slot('$_[0]', "'$attr_name'")
-    . '}';
+    my $code = $self->_eval_closure(
+        {},
+        'sub {'
+        . $meta_instance->inline_deinitialize_slot('$_[0]', $attr_name)
+        . '}'
+    );
     confess "Could not generate inline clearer because : $@" if $@;
 
     return $code;
@@ -182,49 +272,84 @@ __END__
 
 =pod
 
-=head1 NAME 
+=head1 NAME
 
 Class::MOP::Method::Accessor - Method Meta Object for accessors
 
 =head1 SYNOPSIS
 
-  # ... more to come later maybe
+    use Class::MOP::Method::Accessor;
+
+    my $reader = Class::MOP::Method::Accessor->new(
+        attribute     => $attribute,
+        is_inline     => 1,
+        accessor_type => 'reader',
+    );
+
+    $reader->body->execute($instance); # call the reader method
 
 =head1 DESCRIPTION
 
+This is a subclass of <Class::MOP::Method> which is used by
+C<Class::MOP::Attribute> to generate accessor code. It handles
+generation of readers, writers, predicates and clearers. For each type
+of method, it can either create a subroutine reference, or actually
+inline code by generating a string and C<eval>'ing it.
+
 =head1 METHODS
 
 =over 4
 
-=item B<new>
+=item B<< Class::MOP::Method::Accessor->new(%options) >>
+
+This returns a new C<Class::MOP::Method::Accessor> based on the
+C<%options> provided.
 
-=item B<intialize_body>
+=over 4
 
-=item B<accessor_type>
+=item * attribute
 
-=item B<is_inline>
+This is the C<Class::MOP::Attribute> for which accessors are being
+generated. This option is required.
 
-=item B<associated_attribute>
+=item * accessor_type
 
-=item B<generate_accessor_method>
+This is a string which should be one of "reader", "writer",
+"accessor", "predicate", or "clearer". This is the type of method
+being generated. This option is required.
 
-=item B<generate_accessor_method_inline>
+=item * is_inline
 
-=item B<generate_clearer_method>
+This indicates whether or not the accessor should be inlined. This
+defaults to false.
 
-=item B<generate_clearer_method_inline>
+=item * name
 
-=item B<generate_predicate_method>
+The method name (without a package name). This is required.
 
-=item B<generate_predicate_method_inline>
+=item * package_name
 
-=item B<generate_reader_method>
+The package name for the method. This is required.
 
-=item B<generate_reader_method_inline>
+=back
 
-=item B<generate_writer_method>
+=item B<< $metamethod->accessor_type >>
 
-=item B<generate_writer_method_inline>
+Returns the accessor type which was passed to C<new>.
+
+=item B<< $metamethod->is_inline >>
+
+Returns a boolean indicating whether or not the accessor is inlined.
+
+=item B<< $metamethod->associated_attribute >>
+
+This returns the L<Class::MOP::Attribute> object which was passed to
+C<new>.
+
+=item B<< $metamethod->body >>
+
+The method itself is I<generated> when the accessor object is
+constructed.
 
 =back
 
@@ -232,16 +357,14 @@ Class::MOP::Method::Accessor - Method Meta Object for accessors
 
 Stevan Little E<lt>stevan@iinteractive.comE<gt>
 
-Yuval Kogman E<lt>nothingmuch@woobling.comE<gt>
-
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2006 by Infinity Interactive, Inc.
+Copyright 2006-2009 by Infinity Interactive, Inc.
 
 L<http://www.iinteractive.com>
 
 This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself. 
+it under the same terms as Perl itself.
 
 =cut