#!/usr/bin/perl use strict; use warnings; package AutoVivify; use vars qw/$AUTOLOAD/; sub new($$) { my ($class, $initializer) = @_; die "Initializer must be a code reference." unless (ref($initializer) eq 'CODE'); my $self = {initializer => $initializer}; bless($self, $class); return $self; } sub AUTOLOAD { $_[0] = &{$_[0]->{initializer}}(); $AUTOLOAD =~ s/.*:://; eval "\$_[0]->$AUTOLOAD(\@_)"; } sub DESTROY { } 1; #### #!/usr/bin/perl use strict; use warnings; package foo::bar; sub new() { return bless({}, shift); } sub aaa() { my $self = shift; warn "aaa"; $self->{foo} = "bar"; } sub bbb($$) { my $self = shift; warn shift; warn $self->{foo}; } package main; use AutoVivify; my $x = AutoVivify->new(sub {return foo::bar->new()}); $x->aaa(); #$x is now an object of type foo::bar $x->bbb(2);