See
Class::Tables for the full code. The basic idea is that the object implementation is a blessed scalar holding the tuple's primary key. I can also tell what database table it belongs to by what class it's blessed into. I use these two pieces of information to address a deep hash with all the accessor data. The general idea is:
my $DATA;
sub id { ${+shift} }
# $obj->column_name()
# $obj->field("column_name")
sub field {
my ($self, $col) = @_;
my $table = (ref $self)->_table;
my $id = $self->id;
return $DATA{$table}{$id}{$col};
}
The DESTROY method I gave in the previous post was for the benefit of
theAcolyte and the basic inside-out mechanism. You're right that in my code, since the data should stay around as long as there's an object that might need it, I have to do something a little more clever. I end up doing my own form of reference counting. Each time I make an object, I increment
$COUNT{$table}{$id}. Each time an object is destroyed, I decrement that count and if the count became zero, clear out the appropriate part of the
%DATA hash (and
%COUNT as well).