--- nfo/perl/libs/Tangram/AbstractHash.pm 2002/11/25 00:05:48 1.1 +++ nfo/perl/libs/Tangram/AbstractHash.pm 2003/05/10 17:48:16 1.3 @@ -5,7 +5,8 @@ package Tangram::AbstractHash; use Tangram::Coll; -use base qw( Tangram::Coll ); +use vars qw(@ISA); + @ISA = qw( Tangram::Coll ); use Carp; @@ -20,7 +21,7 @@ my ($self, $def, $storage, $obj, $member, $class) = @_; print $Tangram::TRACE "loading $member\n" if $Tangram::TRACE; - + my %coll; if (my $prefetch = $storage->{PREFETCH}{$class}{$member}{$storage->id($obj)}) @@ -30,7 +31,7 @@ else { my $cursor = $self->cursor($def, $storage, $obj, $member); - + for (my $item = $cursor->select; $item; $item = $cursor->next) { my $slot = shift @{ $cursor->{-residue} }; @@ -38,10 +39,49 @@ } } - $storage->{scratch}{ref($self)}{$storage->id($obj)}{$member} = { - map { $_ => ($coll{$_} && $storage->id( $coll{$_} ) ) } keys %coll }; + $self->set_load_state($storage, $obj, $member, { map { $_ => ($coll{$_} && $storage->id( $coll{$_} ) ) } keys %coll } ); return \%coll; } +sub save_content + { + my ($obj, $field, $context) = @_; + + # has collection been loaded? if not, then it hasn't been modified + return if tied $obj->{$field}; + return unless exists $obj->{$field} && defined $obj->{$field}; + + my $storage = $context->{storage}; + + foreach my $item (values %{ $obj->{$field} }) { + $storage->insert($item) + unless $storage->id($item); + } + } + +sub get_exporter + { + my ($self, $context) = @_; + my $field = $self->{name}; + + return sub { + my ($obj, $context) = @_; + + return if tied $obj->{$field}; + return unless exists $obj->{$field} && defined $obj->{$field}; + + my $storage = $context->{storage}; + + foreach my $item (values %{ $obj->{$field} }) { + $storage->insert($item) + unless $storage->id($item); + } + + $context->{storage}->defer(sub { $self->defered_save($obj, $field, $storage) } ); + (); + } + } + + 1;