So I want a logger object, and only one logger object thought it may be used in various packages. I follow the simple instructions at https://www.perl.com/article/52/2013/12/11/Implementing-the-singleton-pattern-in-Perl but when I test it I see I get two objects. In the following test one gets its 'Log' value altered and the other does not ...
The test ...
perl -MData::Dumper -Mlib=. -MHelper::Lgr -E' \
$l=Helper::Lgr->getInstance();$l->log(0,"Log1"); \
$z=Helper::Lgr->getInstance();$l->set('Log', 4); \
print Dumper $l; \
print Dumper $z'
Get instance called from main
Not yet instantiated
Sun Dec 29 18:51:08 2019 Log1
Get instance called from main
Not yet instantiated
$VAR1 = bless( {
'LogName' => 'CommandLine.log',
'_continuation' => 0,
'Screen' => 0,
'LogDir' => '/home/random/log',
'fh' => \*Helper::Lgr::__ANONIO__,
'Log' => 4
}, 'Helper::Lgr' );
$VAR1 = bless( {
'LogDir' => '/home/random/log',
'Screen' => 0,
'LogName' => 'CommandLine.log',
'_continuation' => 0,
'Log' => 0,
'fh' => \*Helper::Lgr::__ANONIO__
}, 'Helper::Lgr' );
Here is the start of the Logger pm that I am using, the set method is pretty much what you expect,so not reprduced here ...
#!/usr/bin/perl
#
# Lgr.pm
#
# Controls both logging to a file and to the screen
# you can set a verbosity for each independently
#
package Helper::Lgr;
use strict;
use warnings;
use v5.10.0;
use File::Basename;
use File::Path qw(make_path);
use FindBin;
use Data::Dumper;
my $script = basename( $0, '.pl', '.pm' );
# Logger is a classic singleton pattern. We only want one instance in
+our code
my $instance = undef;
sub getInstance {
say "Get instance called from ".( caller );
if ($instance) { # Already instantiated, check if we need to chang
+e any settings
say "Already instantiated";
return $instance;
}
else {
say "Not yet instantiated";
}
my $class = shift;
my $instance = shift; # settings to use
$instance = {} unless $instance;
die "$instance is not a hash ref\n" unless ref $instance eq 'HASH'
+;
bless $instance, $class; # we bless early so we can call methods o
+n ourself
... And much more ...
What simple fact am I missing that I get a fresh logger each time?
Cheers,
R.
Pereant, qui ante nos nostra dixerunt!