def match_attribute_value(prop, newval, oldval)
      # make Enumerable targets and sources for matching
      sources = newval.to_enum
      targets = oldval.to_enum
      
      # match sources to targets
      unless oldval.nil_or_empty? then
        logger.debug { "Matching source #{newval.qp} to target #{qp} #{prop} #{oldval.qp}..." }
      end
      matches = block_given? ? yield(sources, targets) : Resource.match_all(sources, targets)
      logger.debug { "Matched #{qp} #{prop}: #{matches.qp}." } unless matches.empty?
      matches
    end
def match_attribute_value(prop, newval, oldval)
      # make Enumerable targets and sources for matching
      sources = newval.to_enum
      targets = oldval.to_enum
      
      # match sources to targets
      unless oldval.nil_or_empty? then
        logger.debug { "Matching source #{newval.qp} to target #{qp} #{prop} #{oldval.qp}..." }
      end
      matches = block_given? ? yield(sources, targets) : Resource.match_all(sources, targets)
      logger.debug { "Matched #{qp} #{prop}: #{matches.qp}." } unless matches.empty?
      matches
    end
Returns the source => target hash of matches for the given prop newval sources and
 oldval targets. If the matcher block is given, then that block is called on the sources
 and targets. Otherwise, {Resource.match_all} is called.

 @param [Property] prop the attribute to match
 @param newval the source value
 @param oldval the target value
 @yield [sources, targets] matches sources to targets
 @yieldparam [<Resource>] sources an Enumerable on the source value
 @yieldparam [<Resource>] targets an Enumerable on the target value
 @return [{Resource => Resource}] the source => target matches