package 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;
|
|
}
|
|
}
|
|
|
|
# return;
|
|
}
|
|
|
|
1;
|
|
|
|
=pod
|
|
|
|
=head1 NAME
|
|
|
|
MethodSpit - quickie method generation
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
The following bits are cheap method generation, in place of using
|
|
Class::Accessor or Object::Tiny.
|
|
|
|
=cut
|