Aion
view release on metacpan or search on metacpan
lib/Aion/Meta/FeatureConstruct.pm view on Meta::CPAN
}
sub add_attr { shift->_expand('attr', @_) }
sub add_preset { shift->_expand('preset', @_) }
sub add_trigger { shift->_expand('trigger', @_) }
sub add_cleaner { shift->_expand('cleaner', @_) }
sub add_access { shift->_expand('access', @_) }
sub add_release {
my $self = shift;
@$self{qw/getvar ret/} = ('my $val = %(get)s;', '$val') if $self->{ret} eq '';
$self->_expand('release', @_)
}
sub _expand(@) {
my ($self, $key, $code, $shift) = @_;
if(ref $self->{$key}) {
if($shift) { unshift @{$self->{$key}}, $code }
else { push @{$self->{$key}}, $code }
}
elsif ($self->{$key} eq '') {
$self->{$key} = $code;
}
else {
$self->{$key} = $shift? [$code, $self->{$key}]: [$self->{$key}, $code];
}
$self
}
for my $key (qw/initializer destroyer accessor writer reader predicate clearer/) {
*$key = sub {
my ($self) = @_;
_idents($self->_resolv($self->{$key}))
}
}
sub _resolv {
my ($self, $s) = @_;
$s = join '', @$s if ref $s;
$s =~ s{%\((\w*)\)s}{
die "has: not construct `$1`\!" unless exists $self->{$1};
$self->_resolv($self->{$1})
}ge;
$s
}
sub _idents {
local ($_) = @_;
my $indent;
s{(^\t*)|;[\t ]*(\S)}{
if(defined $1) { $indent = $1 } else { ";\n$indent$2" }
}gme;
$_
}
1;
__END__
=encoding utf-8
=head1 NAME
Aion::Meta::FeatureConstruct - accessor, predicate, initializer and clearer
=head1 SYNOPSIS
use Aion::Meta::FeatureConstruct;
our $construct = Aion::Meta::FeatureConstruct->new('My::Package', 'my_feature');
$construct->add_attr(':lvalue');
$construct->accessor # -> << 'END'
package My::Package {
sub my_feature:lvalue {
if (@_>1) {
my ($self, $val) = @_;
$self->{my_feature} = $val;
$self
} else {
my ($self) = @_;
$self->{my_feature}
}
}
}
END
=head1 DESCRIPTION
Designed for constructing getters/setters from pieces of code.
=head1 SUBROUTINES
=head2 new ($pkg, $name)
Constructor.
=head2 pkg
The package to which the attribute belongs. Getter.
$::construct->pkg # -> "My::Package"
=head2 name
Attribute name. Getter.
$::construct->name # -> "my_feature"
=head2 write
Code for writing the value. Getter.
$::construct->write # \> %(preset)s%(set)s%(trigger)s
=head2 read
Code to read the value. Getter.
( run in 1.684 second using v1.01-cache-2.11-cpan-f56aa216473 )