sub TIEHASH { my $class = shift; my $self = bless {},$class; while(my($key,$value) = each(%ENV)) { $self->set_node($key => $value); } return $self; } #### sub TIEHASH { my $class = shift; my $self = $class->new; while(my($key,$value) = each(%ENV)) { $self->set_node($key => $value); } return $self; } #### package A; use Moose; has BBB => ( is => 'rw', lazy => 1, builder => '_build_BBB', handles => [qw( get_node )], ); sub _build_BBB { my $self = shift; my $instance = tie(%ENV, 'BBB'); return $instance; } #### my $a = A->new; print $a->get_node('TERM'), "\n"; #### use v5.14; package MyRole { use Moose::Role; has nodes => ( traits => ['Hash'], is => 'rw', isa => 'HashRef[Item]', handles => { set_node => 'set', get_node => 'get', all_nodes => 'keys', } ); } package BBB { use Moose; with 'MyRole'; } package A { use Moose; has BBB => ( is => 'rw', lazy => 1, default => sub { BBB->new(nodes => \%ENV) }, handles => [qw( get_node )], ); } my $a = A->new; say $a->get_node('TERM');