--- nfo/perl/libs/Data/Mungle/Transform/Deep.pm 2003/02/09 05:10:56 1.8 +++ nfo/perl/libs/Data/Mungle/Transform/Deep.pm 2003/02/18 19:35:56 1.9 @@ -1,7 +1,10 @@ ## --------------------------------------------------------------------------- -## $Id: Deep.pm,v 1.8 2003/02/09 05:10:56 joko Exp $ +## $Id: Deep.pm,v 1.9 2003/02/18 19:35:56 joko Exp $ ## --------------------------------------------------------------------------- ## $Log: Deep.pm,v $ +## Revision 1.9 2003/02/18 19:35:56 joko +## +- modified 'sub refexpr2perlref': now can get the $delimiter passed, too +## ## Revision 1.8 2003/02/09 05:10:56 joko ## + minor update ## @@ -86,6 +89,9 @@ } +# FIXME: could this be refactored using expand? +# btw: "expand": look at scripts@CPAN (System Administration): +# there is a perl make with perl sub var_deref { my $obj = shift; my $options = shift; @@ -413,21 +419,48 @@ my $obj = shift; my $expr = shift; - my $callbackMap = shift; + my $values = shift; + my $delimiter = shift; + + $delimiter ||= '->'; my $value; # detect for callback (code-reference) if (ref($expr) eq 'CODE') { $value = &$expr($obj); - } elsif ($expr =~ m/->/) { + } elsif ($expr =~ m/$delimiter/) { # use expr as complex object reference declaration (obj->subObj->subSubObj->0->attribute) - (my $objPerlRefString, my $parts) = refexpr2perlref_parts($expr); - #print "\n", "expr: $expr"; - #print "\n", "objPerlRefString: $objPerlRefString"; - $value = eval('$obj' . '->' . $objPerlRefString); + (my $objPerlRefString, my $parts) = refexpr2perlref_parts($expr, $delimiter); + + # trace + #print "expr: $expr", "\n"; + #print "objPerlRefString: $objPerlRefString", "\n"; + + my $evstr = '$obj' . '->' . $objPerlRefString; + + # trace + #print "eval: $evstr", "\n"; + + $value = eval($evstr); + die ($@) if $@; - # if value isn't set, try to "fallback" to callbackMap + # if value isn't set, try to set it + my $callbackMap; + if ($values) { + #if (ref $values eq 'HASH') { + if (ref $values eq 'Data::Map') { + $callbackMap = $values->getAttributes(); + } else { + # apply $values as single value to referenced slot + #print "APPLY!", "\n"; + eval('$obj' . '->' . $objPerlRefString . ' = $values;'); + die ($@) if $@; + } + } + + # determine $values - if it's a hashref, use it as a "valueMap" + # "fallback" to callbackMap # callbacks are applied this way: # take the last element of the expression parts and check if this string exists as a key in the callback-map if (!$value && $callbackMap) { @@ -458,9 +491,12 @@ sub refexpr2perlref_parts { my $expr = shift; + my $delimiter = shift; + + $delimiter = quotemeta($delimiter); # split expression by dereference operators first - my @parts_pure = split(/->/, $expr); + my @parts_pure = split(/$delimiter/, $expr); # wrap []'s around each part, if it consists of numeric characters only (=> numeric = array-index), # use {}'s, if there are word-characters in it (=> alphanumeric = hash-key)