Finance-FITF
view release on metacpan or search on metacpan
inc/Class/MOP/Method/Accessor.pm view on Meta::CPAN
#line 1
package Class::MOP::Method::Accessor;
BEGIN {
$Class::MOP::Method::Accessor::AUTHORITY = 'cpan:STEVAN';
}
BEGIN {
$Class::MOP::Method::Accessor::VERSION = '2.0009';
}
use strict;
use warnings;
use Carp 'confess';
use Scalar::Util 'blessed', 'weaken';
use Try::Tiny;
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";
(blessed($options{attribute}) && $options{attribute}->isa('Class::MOP::Attribute'))
|| 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->_initialize_body;
return $self;
}
sub _new {
my $class = shift;
return Class::MOP::Class->initialize($class)->new_object(@_)
if $class ne __PACKAGE__;
my $params = @_ == 1 ? $_[0] : {@_};
return bless {
# inherited from Class::MOP::Method
body => $params->{body},
associated_metaclass => $params->{associated_metaclass},
package_name => $params->{package_name},
name => $params->{name},
original_method => $params->{original_method},
# inherit from Class::MOP::Generated
is_inline => $params->{is_inline} || 0,
definition_context => $params->{definition_context},
# defined in this class
attribute => $params->{attribute},
accessor_type => $params->{accessor_type},
} => $class;
}
## accessors
sub associated_attribute { (shift)->{'attribute'} }
sub accessor_type { (shift)->{'accessor_type'} }
## factory
sub _initialize_body {
my $self = shift;
my $method_name = join "_" => (
'_generate',
$self->accessor_type,
'method',
($self->is_inline ? 'inline' : ())
);
$self->{'body'} = $self->$method_name();
}
## generators
sub _generate_accessor_method {
my $self = shift;
my $attr = $self->associated_attribute;
return sub {
if (@_ >= 2) {
( run in 2.652 seconds using v1.01-cache-2.11-cpan-437f7b0c052 )