use strict;
use warnings;
sub Person
{
my %self = ();
my @data = ( qw/name age/ );
my %mem = ();
sub
{
for my $sub ( @data )
{
$self{$sub} = sub {
$mem{$sub} = $_[0] if @_; return $mem{$sub} }
}
return \&{$self{$_[0]}} if defined $self{$_[0]};
die "Method '$_[0]' unknown to class Person";
}
}
####
# creating object
my $john = Person;
# initializing values
$john->('name')->('John');
$john->('age')->(23);
# working with object
print "I'm ",
$john->('name')->(),
" and I am ",
$john->('age')->(),
" years-old, but my birthday is in just 2 seconds\n";
sleep( 2 );
$john->('age')->(24);
print "Happy B-Day, ", $john->('name')->(), "!!!\n";
print "It's ", $john->('age')->(), " years-old already!!!\n";
print $john->('address')->();
__END__
##
##
I'm John and I am 23 years-old, but my birthday is in just 2 seconds
[two seconds pass...]
Happy B-Day, John!!!
It's 24 years-old already!!!
Uncaught exception from user code:
Method 'address' unknown to class Person at closure.pl line 18.
main::__ANON__('address') called at closure.pl line 40