cvsuser     05/01/07 05:08:02

  Modified:    App-Context/lib/App Reference.pm
  Log:
  implemented overlay() more completely
  
  Revision  Changes    Path
  1.4       +28 -4     p5ee/App-Context/lib/App/Reference.pm
  
  Index: Reference.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/App-Context/lib/App/Reference.pm,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Reference.pm      22 Mar 2003 04:04:34 -0000      1.3
  +++ Reference.pm      7 Jan 2005 13:08:02 -0000       1.4
  @@ -1,10 +1,10 @@
   
   #############################################################################
  -## $Id: Reference.pm,v 1.3 2003/03/22 04:04:34 spadkins Exp $
  +## $Id: Reference.pm,v 1.4 2005/01/07 13:08:02 spadkins Exp $
   #############################################################################
   
   package App::Reference;
  -$VERSION = do { my @r=(q$Revision: 1.3 $=~/\d+/g); sprintf 
"%d."."%02d"x$#r,@r};
  +$VERSION = do { my @r=(q$Revision: 1.4 $=~/\d+/g); sprintf 
"%d."."%02d"x$#r,@r};
   
   use strict;
   
  @@ -326,6 +326,7 @@
   =cut
   
   sub overlay {
  +    &App::sub_entry if ($App::trace);
       my $self = shift;
       my ($ref1, $ref2, $key);
       return if ($#_ < 0 || $#_ > 1);
  @@ -337,9 +338,32 @@
           $ref1 = $_[0];
           $ref2 = $_[1];
       }
  -    foreach $key (keys %$ref2) {
  -        $ref1->{$key} = $ref2->{$key} if (!exists $ref1->{$key});
  +    my $ref1type = ref($ref1);
  +    my $ref2type = ref($ref2);
  +    if ($ref1type eq "ARRAY" && $ref1type eq $ref2type) {
  +        # array: nothing to do
       }
  +    elsif ($ref1type eq "" && $ref1type eq $ref2type) {
  +        # scalar: nothing to do
  +    }
  +    else {
  +        # hash
  +        foreach $key (keys %$ref2) {
  +            if (!exists $ref1->{$key}) {
  +                $ref1->{$key} = $ref2->{$key};
  +            }
  +            else {
  +                $ref1type = ref($ref1->{$key});
  +                if ($ref1type && $ref1type ne "ARRAY") {
  +                    $ref2type = ref($ref2->{$key});
  +                    if ($ref1type eq $ref2type) {
  +                        $self->overlay($ref1->{$key}, $ref2->{$key});
  +                    }
  +                }
  +            }
  +        }
  +    }
  +    &App::sub_exit() if ($App::trace);
   }
   
   #############################################################################
  
  
  

Reply via email to