#! /usr/bin/env perl use warnings; use strict; package BigObjs; use Moose; has 'little_objs' => ( is => 'rw', isa => 'HashRef', default => sub { {} } ); # our reader method sub get_little_obj { my ($s, $id) = @_; return $s->little_objs->{$id}; } # add new little objects to our collection sub add_little_obj { my ($s, $little_obj) = @_; # create code ref to reader method in big object $little_obj->get_obj_by_id(sub{$s->get_little_obj(@_)}); $s->little_objs->{$little_obj->id} = $little_obj; } package LittleObjs; use Moose; has 'id' => (is => 'rw'); has 'data' => (is => 'rw'); has 'get_obj_by_id' => (is => 'rw'); sub alter_another_little_object { my ($s, $id) = @_; my $other_little_object = $s->get_obj_by_id->($id); $other_little_object->do_stuff; } sub do_stuff { my $s = shift; print "I'm doing stuff to: " . $s->id . "\n"; } no Moose; my $big = BigObjs->new(); my $little1 = LittleObjs->new(id => 'little1', data => 'foo'); my $little2 = LittleObjs->new(id => 'little2', data => 'bar'); $big->add_little_obj($little1); $big->add_little_obj($little2); $little1->alter_another_little_object('little2');