# -*- coding: binary -*-

# Rex::Struct2
module Rex
module Struct2

module Element

  # elements should have to_s, but we don't define it here because
  # it will just overlap with inheritence and cause issues

  attr_reader  :value, :restraint, :container
  attr_writer  :restraint, :container

  # update the restraints on any value change
  def value=(newval)
    @value = newval
    self.update_restraint
  end

  # avoid conflicting with normal namespace length()
  def slength
    to_s().length()
  end

  def update_restraint
    if self.restraint
      # Sort of a hack, but remove the restraint before we update, so we aren't using
      # the old restraint during calculating the restraint update value
      old_restraint, self.restraint = self.restraint, nil
      old_restraint.update(self.slength)
      self.restraint = old_restraint
    end

    if self.container
      self.container.update_restraint
    end
  end

end

# end Rex::Struct2
end
end
