=pod
|
|
|
|
=head1 NAME
|
|
|
|
App::WRT::MethodSpit - quickie method generation
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
# In Foo.pm:
|
|
package Foo;
|
|
use base 'App::WRT::MethodSpit';
|
|
|
|
%default = (
|
|
baz => 'bar,
|
|
biz => 'buz'
|
|
);
|
|
|
|
# Set up accessor methods:
|
|
__PACKAGE__->methodspit( keys %default );
|
|
|
|
sub new {
|
|
my $class = shift;
|
|
my %params = @_;
|
|
|
|
my %copy_of_default = %default;
|
|
my $self = \%copy_of_default;
|
|
bless $self, $class;
|
|
|
|
$self->configure(%params);
|
|
|
|
return $self;
|
|
}
|
|
|
|
# In calling code:
|
|
$obj = Foo->new(
|
|
baz => 'waffle'
|
|
);
|
|
say $obj->baz; # waffle
|
|
say $obj->biz; # buz
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Cheap method generation, in place of using Class::Accessor or Object::Tiny.
|
|
|
|
Kind of stupid.
|
|
|
|
=cut
|
|
|
|
package App::WRT::MethodSpit;
|
|
|
|
use strict;
|
|
use warnings;
|
|
no warnings 'uninitialized';
|
|
|
|
sub methodspit {
|
|
my ($class, @names) = @_;
|
|
|
|
# These are simple accessors.
|
|
foreach my $name (@names) {
|
|
makemethod($class, $name);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
# Handy-dandy basic closure:
|
|
sub makemethod {
|
|
my ($class, $name) = @_;
|
|
|
|
no strict 'refs';
|
|
|
|
# Install a generated sub:
|
|
*{ "${class}::${name}" } =
|
|
sub {
|
|
my ($self, $param) = @_;
|
|
$self->{$name} = $param if defined $param;
|
|
return $self->{$name};
|
|
}
|
|
}
|
|
|
|
sub methodspit_depend {
|
|
my ($class, $dependency, $names) = @_;
|
|
|
|
my %names = %{ $names };
|
|
|
|
foreach my $name (keys %names) {
|
|
my $default = $names{$name};
|
|
makemethod_depend($class, $dependency, $name, $default);
|
|
}
|
|
}
|
|
|
|
# A more complicated closure. Makes a return value dependent on another
|
|
# method, if not already explicitly defined.
|
|
|
|
sub makemethod_depend {
|
|
my ($class, $dependency, $name, $default) = @_;
|
|
|
|
no strict 'refs';
|
|
|
|
*{ "${class}::${name}" } =
|
|
sub {
|
|
my ($self, $param) = @_;
|
|
|
|
if (defined $param) {
|
|
$self->{$name} = $param;
|
|
}
|
|
|
|
if (defined $self->{$name}) {
|
|
return $self->{$name};
|
|
} else {
|
|
return $self->$dependency . $default;
|
|
}
|
|
}
|
|
}
|
|
|
|
# Set specified parameters:
|
|
|
|
sub configure {
|
|
my $self = shift;
|
|
my %params = @_;
|
|
|
|
for my $p (keys %params) {
|
|
$self->{$p} = $params{$p};
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
1;
|