package Number;
use strict;
# Hash to hold singletons
use vars qw ($numbers);
$numbers = {};
sub new {
my ($class, $number, $text) = @_;
# Check for and return an existing singleton
return $numbers->{$number} if ($numbers->{$number});
# Build the object
my $self = {};
bless($self, $class);
# Fill in the values
$self->_populate($number, $text);
return $self;
}
sub _populate {
my ($self, $number, $text) = @_;
$self->{'number'} = $number;
$self->{'text'} = $text;
# Store it as the singleton definition and return
$numbers->{$number} = $self;
return $numbers->{$number};
}
sub asNumber {
my ($self) = @_;
return $self->{'number'};
}
sub asText {
my ($self) = @_;
return $self->{'text'};
}
sub STORABLE_freeze {
my ($self, $cloning) = @_;
my $num = $self->asNumber();
my $txt = $self->asText();
my $numTxt = "$num$txt";
print "Freeze $numTxt\n";
return "$num$txt";
}
sub STORABLE_thaw {
my ($obj, $cloning, $serialized) = @_;
my ($num, $txt) = ($serialized =~ /(\d+)(\w+)/);
printf("Thaw num: ($num) text: ($txt) obj: ($obj)\n", $num, $txt, $obj);
$obj->_populate($num, $txt);
return;
}
1;
####
#!/usr/bin/env dvperl
use strict;
use Number;
use Storable;
my $stuff = {'one' => new Number(1, "One"),
'two' => new Number(2, "Two"),
'twotwo' => new Number(2, "Two")};
foreach my $key (keys %$stuff) {
my $number = $stuff->{$key};
my $num = $number->asNumber();
my $txt = $number->asText();
print ("Key: ($key)\tNum: ($num)\tTxt: ($txt)\tObject: ($number)\n");
}
store $stuff, 'storefile';
####
#!/usr/bin/env dvperl
use strict;
use Number;
use Storable;
my $stuff;
$stuff = retrieve 'storefile';
foreach my $key (keys %$stuff) {
my $number = $stuff->{$key};
my $num = $number->asNumber();
my $txt = $number->asText();
print ("Key: ($key)\tNum: ($num)\tTxt: ($txt)\tObject: ($number)\n");
}