in reply to OO automatic accessor generation
You shouldn't add the accessor generation code to the constructor (unless you really want to redefine your accessor methods each time you instantiate DataTable).
Try this:
package DataTable;
# Important!
use strict;
use warnings;
my @ATTRIBUTES_SCALAR = qw(
tablename
);
my @ATTRIBUTES_ARRAY = qw(
columns
datatypes
lengths
decimals
signed
allownull
default
usequote
);
my @ATTRIBUTES_HASH = qw(
indices
);
sub new {
my $class = shift;
my $self = bless {}, $class;
$self->{$_} = undef for @ATTRIBUTES_SCALAR;
$self->{$_} = [] for @ATTRIBUTES_ARRAY;
$self->{$_} = {} for @ATTRIBUTES_HASH;
return $self;
}
{
no strict 'refs';
for ( @ATTRIBUTES_SCALAR ) {
my $attribute = $_;
*{ __PACKAGE__ . '::' . $attribute } = sub {
my $self = shift;
$self->{$attribute} = shift if @_;
return $self->{$attribute};
};
}
for ( @ATTRIBUTES_ARRAY ) {
my $attribute = $_;
*{ __PACKAGE__ . '::' . $attribute } = sub {
my $self = shift;
@{$self->{$attribute}} = @_ if @_;
return @{$self->{$attribute}};
};
}
for ( @ATTRIBUTES_HASH ) {
my $attribute = $_;
*{ __PACKAGE__ . '::' . $attribute } = sub {
my $self = shift;
%{$self->{$attribute}} = @_ if @_;
return %{$self->{$attribute}};
};
}
}
1;
Update: Fixed a typo
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: OO automatic accessor generation
by Neighbour (Friar) on Nov 12, 2009 at 15:40 UTC |