package SharedvariablesM; use strict; use warnings; sub new { my $class = shift; my $self = { # we store here all shared variables, but this is done automatic store => {} }; bless $self, $class; return $self; } sub value { my $self = shift; my $name = shift; # optional parameter for setting the $DEBUG to a new value # if this new-value is absent the we just return current value of $DEBUG my $newvalue = shift; # optional boilerplate to keep track who called us and from where: my $parent = (caller(1))[3]; if( ! defined($parent) ){ $parent = 'main' } my $whoami = ( caller(0) )[3].'()'; my $itsnewname = ! exists $self->{'store'}->{$name}; if( defined $newvalue ){ if( $itsnewname ){ warn "$whoami (via $parent) : creating new variable '$name'..." } else { warn "$whoami (via $parent) : modifying '$name' from ".$self->{'store'}->{$name}." to $newvalue"; } $self->{'store'}->{$name} = $newvalue } elsif( $itsnewname ){ die "$whoami (via $parent) : you are creating a new shared variable named '$name' without a value unless you have the variable name wrong!" } return $self->{'store'}->{$name} } # clone ourselves and return new object sub clone { my $self = shift; my $aclone = SharedvariablesM->new(); for my $name (keys %{$self->{'store'}}){ $aclone->value($name, $self->value($name)); } return $aclone } sub toString { my $self = shift; my $ret = __PACKAGE__." here is what I store:\n"; for my $name (sort keys %{$self->{'store'}}){ $ret .= $name . '=>' . $self->{'store'}->{$name} . "\n" } return $ret; } 1;