Lexical-Accessor
view release on metacpan or search on metacpan
lib/Sub/HandlesVia/Toolkit/SubAccessorSmall.pm view on Meta::CPAN
use 5.008003;
use strict;
use warnings;
no warnings qw( void once uninitialized );
package Sub::HandlesVia::Toolkit::SubAccessorSmall;
our $AUTHORITY = 'cpan:TOBYINK';
our $VERSION = '1.001002';
use Sub::HandlesVia::Toolkit;
our @ISA = 'Sub::HandlesVia::Toolkit';
$ISA[0]->VERSION( '0.025' );
sub new {
my $class = shift;
bless { @_ } => $class;
}
sub _attr {
shift->{attr};
}
sub _handles_map {
shift->{handles_map};
}
sub clean_spec {
my ( $self, $target, $attr, $spec ) = @_;
if ( 'ARRAY' eq ref $spec->{handles} ) {
my %tmp = @{ $spec->{handles} };
$spec->{handles} = \%tmp;
}
return $self->SUPER::clean_spec( $target, $attr, $spec );
}
sub code_generator_for_attribute {
my ( $self, $target, $attr ) = @_;
my $realattr = $self->_attr;
my $handles_map = $self->_handles_map;
my $captures = ( $realattr->{inline_environment} ||= {} );
my $slot = sub {
my $gen = shift;
delete local $realattr->{chain};
$realattr->inline_access($gen->generate_self);
};
my ( $get, $set, $get_is_lvalue );
if ( $realattr->has_simple_reader ) {
$get = sub {
my $gen = shift;
return $realattr->inline_access($gen->generate_self);
};
$get_is_lvalue = !!1;
}
else {
$get = sub {
my $gen = shift;
return $realattr->inline_reader( $gen->generate_self );
}
}
if ( $realattr->has_simple_writer ) {
$set = sub {
my ( $gen, $val ) = @_;
delete local $realattr->{chain};
return sprintf('(%s)', $realattr->inline_access_w($gen->generate_self, $val) );
};
}
else {
$set = sub {
my ( $gen, $val ) = @_;
delete local $realattr->{chain};
return $realattr->inline_writer( $gen->generate_self, $val );
( run in 1.376 second using v1.01-cache-2.11-cpan-fe3c2283af0 )