Module: Traited
- Defined in:
- lib/traited.rb
Overview
Traited helps you doing configuration similar to class variables.
It’s built on a simple Hash, where keys are objects and the values the configuration. By using #ancestral_trait you will get nicely inherited configuration, where keys later in the ancestors will take precedence.
Class Method Summary collapse
Instance Method Summary collapse
-
#ancestral_trait ⇒ Object
Builds a trait from all the ancestors, closer ancestors overwrite distant ancestors.
- #ancestral_trait_values(key) ⇒ Object
-
#class_trait ⇒ Object
trait for self.class if we are an instance.
- #each_ancestral_trait(obj) ⇒ Object
- #trait(hash = nil) ⇒ Object
Class Method Details
.included(into) ⇒ Object
30 31 32 |
# File 'lib/traited.rb', line 30 def self.included(into) into.extend(self) end |
Instance Method Details
#ancestral_trait ⇒ Object
Builds a trait from all the ancestors, closer ancestors overwrite distant ancestors
class Foo
include Innate::Traited
trait :one => :eins, :first => :erstes
end
class Bar < Foo
trait :two => :zwei
end
class Foobar < Bar
trait :three => :drei, :first => :overwritten
end
Foobar.ancestral_trait # => => :drei, :two => :zwei, :one => :eins, :first => :overwritten
64 65 66 67 68 |
# File 'lib/traited.rb', line 64 def ancestral_trait klass = self.kind_of?(Module) ? self : self.class ANCESTRAL_TRAITS[klass] ||= each_ancestral_trait({}){|hash, trait| hash.update(trait) } end |
#ancestral_trait_values(key) ⇒ Object
70 71 72 73 74 75 |
# File 'lib/traited.rb', line 70 def ancestral_trait_values(key) klass = self.kind_of?(Module) ? self : self.class cache = ANCESTRAL_VALUES[klass] ||= {} cache[key] ||= each_ancestral_trait([]){|array, trait| array << trait[key] if trait.key?(key) } end |
#class_trait ⇒ Object
trait for self.class if we are an instance
85 86 87 |
# File 'lib/traited.rb', line 85 def class_trait respond_to?(:ancestors) ? trait : self.class.trait end |
#each_ancestral_trait(obj) ⇒ Object
77 78 79 80 81 82 |
# File 'lib/traited.rb', line 77 def each_ancestral_trait(obj) ancs = respond_to?(:ancestors) ? ancestors : self.class.ancestors ancs.unshift(self) ancs.reverse_each{|anc| yield(obj, TRAITS[anc]) if TRAITS.key?(anc) } obj end |
#trait(hash = nil) ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/traited.rb', line 34 def trait(hash = nil) if hash TRAITS[self] ||= {} result = TRAITS[self].merge!(hash) ANCESTRAL_VALUES.clear ANCESTRAL_TRAITS.clear result else TRAITS[self] || {} end end |