def snapshot_equal_content?(attribute=nil)
      if attribute then
        value = send(attribute)
        ssval = @snapshot[attribute]
        eq = Jinx::Resource.value_equal?(value, ssval)
        unless eq then
          logger.debug { "#{qp} #{attribute} snapshot value #{ssval.qp} differs from the current value #{value.qp}." }
        end
        return eq
      end
      
      vh = value_hash(self.class.updatable_attributes)
      
      # KLUDGE TODO - confirm this is still a problem and fix.
      # In the Galena frozen migration example, the SpecimenPosition snapshot doesn't include the identifier.
      # This bug could be related to the problem of an abstract DomainObject not being added as a domain module class.
      # Work around this here by setting the snapshot identifier.
      # See the ClinicalTrials::Jinx::Resource rubydoc for more info.
      if vh[:identifier] and not @snapshot[:identifier] then
        @snapshot[:identifier] = vh[:identifier]
      end
      # END OF KLUDGE
      
      if @snapshot.size < vh.size then
        pa, pv = vh.detect { |a, v| not @snapshot.has_key?(a) }
        logger.debug { "#{qp} is missing snapshot #{pa} compared to the current value #{pv.qp}." }
        false
      elsif @snapshot.size > vh.size then
        pa, value = @snapshot.detect { |a, v| not vh.has_key?(a) }
        logger.debug { "#{qp} has snapshot #{pa} value #{value.qp} not found in current content." }
        false
      else
        @snapshot.all? do |pa, ssval|
          pv = vh[pa]
          eq = Jinx::Resource.value_equal?(pv, ssval)
          unless eq then
            logger.debug { "#{qp} #{pa} snapshot value #{ssval.qp} differs from the current value #{pv.qp}." }
          end
          eq
        end
      end
    end
def snapshot_equal_content?(attribute=nil)
      if attribute then
        value = send(attribute)
        ssval = @snapshot[attribute]
        eq = Jinx::Resource.value_equal?(value, ssval)
        unless eq then
          logger.debug { "#{qp} #{attribute} snapshot value #{ssval.qp} differs from the current value #{value.qp}." }
        end
        return eq
      end
      
      vh = value_hash(self.class.updatable_attributes)
      
      # KLUDGE TODO - confirm this is still a problem and fix.
      # In the Galena frozen migration example, the SpecimenPosition snapshot doesn't include the identifier.
      # This bug could be related to the problem of an abstract DomainObject not being added as a domain module class.
      # Work around this here by setting the snapshot identifier.
      # See the ClinicalTrials::Jinx::Resource rubydoc for more info.
      if vh[:identifier] and not @snapshot[:identifier] then
        @snapshot[:identifier] = vh[:identifier]
      end
      # END OF KLUDGE
      
      if @snapshot.size < vh.size then
        pa, pv = vh.detect { |a, v| not @snapshot.has_key?(a) }
        logger.debug { "#{qp} is missing snapshot #{pa} compared to the current value #{pv.qp}." }
        false
      elsif @snapshot.size > vh.size then
        pa, value = @snapshot.detect { |a, v| not vh.has_key?(a) }
        logger.debug { "#{qp} has snapshot #{pa} value #{value.qp} not found in current content." }
        false
      else
        @snapshot.all? do |pa, ssval|
          pv = vh[pa]
          eq = Jinx::Resource.value_equal?(pv, ssval)
          unless eq then
            logger.debug { "#{qp} #{pa} snapshot value #{ssval.qp} differs from the current value #{pv.qp}." }
          end
          eq
        end
      end
    end
Returns whether the {#snapshot} and current content are equal.
 The attribute values _v_ and _ov_ of the snapshot and current content, resp., are
 compared with equality determined by {Jinx::Resource.value_equal?}.

 @param (see #changed?)
 @return [Boolean] whether the {#snapshot} and current content are equal