lib/characterizable.rb in characterizable-0.0.14 vs lib/characterizable.rb in characterizable-0.0.15

- old
+ new

@@ -6,11 +6,10 @@ active_support/core_ext/hash/slice active_support/core_ext/class/attribute_accessors active_support/core_ext/object/blank active_support/core_ext/array/wrap active_support/core_ext/module/aliasing - active_support/core_ext/module/delegation }.each do |active_support_3_requirement| require active_support_3_requirement end if ActiveSupport::VERSION::MAJOR == 3 module Characterizable @@ -72,18 +71,18 @@ _take_snapshot end def _take_snapshot target.characterizable_base.characteristics.each do |_, c| if c.known?(target) - #if c.effective?(target) + if c.effective?(target) self[c.name] = c.value(target) - #elsif !c.untrumped?(target) - # trumped_keys.push c.name - #elsif !c.revealed?(target) - # wasted_keys.push c.name - # lacking_keys.push c.prerequisite - #end + elsif !c.untrumped?(target) + trumped_keys.push c.name + elsif !c.revealed?(target) + wasted_keys.push c.name + lacking_keys.push c.prerequisite + end end end end def []=(key, value) target.expire_snapshot! @@ -97,11 +96,11 @@ end def lacking_keys @lacking_keys ||= Array.new end def effective - target.characterizable_base.characteristics.select { |_, c| c.known?(self) } + target.characterizable_base.characteristics.select { |_, c| c.effective?(self) } end def potential target.characterizable_base.characteristics.select { |_, c| c.potential?(self) } end def wasted @@ -118,15 +117,19 @@ module ClassMethods def characterize(&block) self.characterizable_base ||= Characterizable::Base.new self Blockenspiel.invoke block, characterizable_base end - delegate :characteristics, :to => :characterizable_base + def characteristics + characterizable_base.characteristics + end end class CharacteristicAlreadyDefined < ArgumentError end + class CyclicalTrumping < ArgumentError + end class Base attr_reader :klass def initialize(klass) @klass = klass @@ -164,20 +167,27 @@ @name = name @trumps = Array.wrap options.delete(:trumps) @prerequisite = options.delete(:prerequisite) @options = options Blockenspiel.invoke block, self if block_given? + trumps.each do |trump| + if c = characteristics[trump] and c.trumps.include? name + raise CyclicalTrumping, "On #{base.klass}, '#{c.name}' and '#{name}' trump each other" + end + end end def to_json(*) { :name => name, :trumps => trumps, :prerequisite => prerequisite, :options => options }.to_json end def inspect "<Characterizable::Characteristic name=#{name.inspect} trumps=#{trumps.inspect} prerequisite=#{prerequisite.inspect} options=#{options.inspect}>" end def trumped_by - @_trumped_by ||= characteristics.select { |_, c| c.trumps.include? name } + characteristics.select { |_, c| c.trumps.include? name } end - delegate :characteristics, :to => :base + def characteristics + base.characteristics + end def value(target) case target when Hash target[name] else