#!/usr/bin/perl -w use strict; package TieLazy; use Tie::Hash; @TieLazy::ISA = qw( Tie::StdHash ); sub new { my $class = shift; my %data; tie %data, "TieLazy", @_; bless \%data, $class; } sub TIEHASH { my $self = shift; my %data = %{ +shift }; bless \%data, $self; } sub FETCH { my $self = shift; my $item = shift; if (defined(my $data = ($self->{$item}))) { if (ref($data) eq 'CODE') { return $self->{$item} = $data->(); } else { return $self->{$item}; } } } #### sub do_two { print "Doing two!\n"; return 2; } my $tl = TieLazy->new({one => 1, two => \&do_two}); print join("\t", @$tl{qw( one two two )} ), "\n"; $tl->{three} = 3; print "$$tl{three}\n"; $tl->{four} = sub { print "Four!\n"; return 4; }; print "Four exists!\n" if (exists($tl->{four})); print "$$tl{four}\n"; print "$$tl{four}\n";