in reply to Keeping relationally child objects alive with Moo

Oh wait, you store $self in the model attribute of the table! It creates a reference cycle, so weird things can happen. You can try storing a weakened reference there instead.

For example, you can undef the model, but its destructor isn't called, as it's still referenced from the tables:

#!/usr/bin/perl use warnings; use strict; { package Myproject::Model::Table; use Moo; has name => (is => 'ro'); has model => (is => 'ro'); } { package Myproject::Model; use Moo; has table => (is => 'rw'); sub newtable { my ($self, $name) = @_; my $tob = 'Myproject::Model::Table'->new( name => $name, model => $self, ); $self->table or $self->table({}); $self->table->{$name} = $tob; } sub DESTROY { print "Good bye\n"; } } my $model = 'Myproject::Model'->new; $model->newtable('t1'); undef $model; # No destructor called here. use Data::Dumper; print Dumper $model;

To get the destructor called, you can modify the definition of the model attribute like this:

has model => (is => 'ro', weak_ref => 1);

($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,

Replies are listed 'Best First'.
Re^2: Keeping relationally child objects alive with Moo
by anonymized user 468275 (Curate) on Sep 22, 2017 at 09:14 UTC
    I think you are clearly on the right track, but it's a pity I would want to strengthen rather than weaken these references. So it seems I am still looking for a fundamental change in how I am trying to store multiple objects of one class in a single object of another, because my code will be unmaintainable as it stands and needs to go in a simpler direction from where it has been going in my efforts to fix this. Next experiments are I am going to look into applying formal inheritance to Table, possibly with a root ancestor class for Model and Table and as a last resort removing the Table class and moving all its methods and attributes to Model and using just hash references to each table rather than objects. I can certainly get rid of all my workaround code if I do that.

    One world, one people