module Characterizable class Snapshot < BetterHash attr_reader :universe def initialize(universe) @universe = universe _take_snapshot end def _take_snapshot universe.characterizable_base.characteristics.each do |_, c| if c.known?(universe) if c.effective?(universe) self[c.name] = c.value(universe) elsif c.trumped?(universe) trumped_keys.push c.name elsif !c.revealed?(universe) wasted_keys.push c.name lacking_keys.push c.prerequisite end end end end def []=(key, value) universe.expire_snapshot! super end def wasted_keys @wasted_keys ||= Array.new end def trumped_keys @trumped_keys ||= Array.new end def lacking_keys @lacking_keys ||= Array.new end def effective universe.characterizable_base.characteristics.select { |_, c| c.effective?(self) } end def potential universe.characterizable_base.characteristics.select { |_, c| c.potential?(self) } end def wasted universe.characterizable_base.characteristics.slice(*wasted_keys) end def lacking universe.characterizable_base.characteristics.slice(*(lacking_keys - wasted_keys)) end def trumped universe.characterizable_base.characteristics.slice(*trumped_keys) end end end