#!/usr/bin/perl # package ThreeD; use Moose; use MooseX::ClassAttribute; use namespace::autoclean; class_has 'active_model' => (isa => 'Model', is => 'ro', default => sub {print "DEBUG\n"; my $model = ThreeD::Model->new(); my $entities = $model->active_entities; print "DEBUG 1a\n"; return $model}); __PACKAGE__->meta->make_immutable; no Moose; no MooseX::ClassAttribute; 1; { package ThreeD::Model; use Moose; use namespace::autoclean; has 'active_entities' => (isa => 'Entities', is => 'ro', lazy => 0, default => sub {print "DEBUG 2\n"; my $entities = ThreeD::Entities->new(); print "DEBUG 2b\n"; return $entities}); around BUILDARGS => sub { my ($orig, $class, %args) = @_; print "DEBUG 3\n"; return $class->$orig(%args); }; __PACKAGE__->meta->make_immutable; 1; } { package ThreeD::Entity; use Moose; use namespace::autoclean; use MooseX::FollowPBP; my $my_index = 0; has 'entityID' => (isa => 'Int', is => 'ro', required => 1); around BUILDARGS => sub { my ($orig, $class, %args) = @_; $args{entityID} = $my_index; $my_index++; return $class->$orig(%args); }; __PACKAGE__->meta->make_immutable; 1; } { package ThreeD::Entities; use Moose; use namespace::autoclean; #use MooseX::FollowPBP; use OpenGL; has 'entity' => (isa => 'ArrayRef[ThreeD::Entity]', is => 'rw', default => sub {[]}); __PACKAGE__->meta->make_immutable; 1; } package main; use strict; use warnings; my $model = ThreeD->active_model; my $entities = $model->active_entities;