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