package Objects::Collection::LazyObject; =head1 NAME Objects::Collection::Object - Lazy call. =head1 SYNOPSIS use Objects::Collection::Object; my $lazy = new Objects::Collection::LazyObject:: sub { new SomeClass:: %attr }; =head1 DESCRIPTION Lazy call. =cut use strict; use warnings; use strict; use Carp; $Objects::Collection::LazyObject::VERSION = '0.01'; no strict 'refs'; ### install get/set accessors for this object. for my $key (qw/ ___sub_ref___ ___obj_ref___ /) { no strict 'refs'; *{ __PACKAGE__ . "::$key" } = sub { my $self = shift; $self->{$key} = $_[0] if @_; return $self->{$key}; } } sub new { my $class = shift; $class = ref $class if ref $class; my $self = bless( {}, $class ); $self->___sub_ref___(shift) || return; $self; } sub ___get_object___ { my $self = shift; my $obj = $self->___obj_ref___; unless ($obj) { $obj = $self->___sub_ref___->() || die "can't do lazy call. need result"; $self->___obj_ref___($obj); } $obj; } sub AUTOLOAD { my $self = shift; return if $Objects::Collection::LazyObject::AUTOLOAD =~ /::(DESTROY)$/; ( my $auto_sub ) = $Objects::Collection::LazyObject::AUTOLOAD =~ /.*::(.*)/; return $self->___get_object___->$auto_sub(@_); } 1; __END__ =head1 SEE ALSO Objects::Collection::ActiveRecord, Objects::Collection, README =head1 AUTHOR Zahatski Aliaksandr, =head1 COPYRIGHT AND LICENSE Copyright (C) 2005-2006 by Zahatski Aliaksandr This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available. =cut