my $e = $self->engine;
unless ( $self->offset ) {
+ my $classname = Scalar::Util::blessed( delete $self->{data} );
$self->{offset} = $self->engine->storage->write_to(
refs => undef,
- ref_type => $self->type,
+ ref_type => $self->type,
+ classname => $classname,
);
}
else {
my ($args) = @_;
if ( ( $args->{value}->type || 'S' ) eq 'S' ) {
- $self->engine->storage->write_to(
+ $args->{value}{offset} = $self->engine->storage->write_to(
datas => $args->{value}{offset},
ref_id => $self->offset,
data_type => 'S',
key => $args->{key},
value => $args->{value}{data},
- class => $args->{value}{class},
);
+
+ $args->{value}->reload;
}
else {
+ # Write the Scalar of the Reference
$self->engine->storage->write_to(
- datas => $args->{value}{offset},
+ datas => undef,
ref_id => $self->offset,
data_type => 'R',
key => $args->{key},
value => $args->{value}{offset},
- class => $args->{value}{class},
);
}
-
- $args->{value}->reload;
}
sub delete_key {
sub get_classname {
my $self = shift;
- return;
+ my ($rows) = $self->engine->storage->read_from(
+ 'refs', $self->offset,
+ qw( classname ),
+ );
+ return unless @$rows;
+ return $rows->[0]{classname};
}
+# Look to hoist this method into a ::Reference trait
sub data {
my $self = shift;
my ($args) = @_;
$args ||= {};
- my $obj = DBM::Deep->new({
- type => $self->type,
- base_offset => $self->offset,
-# staleness => $self->staleness,
- storage => $self->engine->storage,
- engine => $self->engine,
- });
-
- if ( $self->engine->storage->{autobless} ) {
- my $classname = $self->get_classname;
- if ( defined $classname ) {
- bless $obj, $classname;
+ my $obj;
+ unless ( $obj = $self->engine->cache->{ $self->offset } ) {
+ $obj = DBM::Deep->new({
+ type => $self->type,
+ base_offset => $self->offset,
+ storage => $self->engine->storage,
+ engine => $self->engine,
+ });
+
+ if ( $self->engine->storage->{autobless} ) {
+ my $classname = $self->get_classname;
+ if ( defined $classname ) {
+ bless $obj, $classname;
+ }
}
+
+ $self->engine->cache->{$self->offset} = $obj;
}
# We're not exporting, so just return.
my $self = shift;
# We're not ready to be removed yet.
- if ( $self->decrement_refcount > 0 ) {
- return;
- }
+ return if $self->decrement_refcount > 0;
+
+ # Rebless the object into DBM::Deep::Null.
+ eval { %{ $self->engine->cache->{ $self->offset } } = (); };
+ eval { @{ $self->engine->cache->{ $self->offset } } = (); };
+ bless $self->engine->cache->{ $self->offset }, 'DBM::Deep::Null';
+ delete $self->engine->cache->{ $self->offset };
$self->engine->storage->delete_from(
'datas', { ref_id => $self->offset },