Module: Innate::Traited

Included in:
Helper::Aspect::SingletonMethods, Node, Ramaze::Cache::MemCache, Ramaze::Cache::Moneta, Ramaze::Cache::Redis, Ramaze::Cache::Sequel, Ramaze::Controller, Ramaze::Helper::Flash, Ramaze::Logger::Informer, Ramaze::Logger::RotatingInformer
Defined in:
/home/manveru/github/ramaze/ramaze.net/tmp/git/innate/lib/innate/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.

Examples:

usage


class Foo
  include Innate::Traited
  trait :hello => 'Hello'

  def initialize
    trait :hello => 'World!'
  end

  def show
    [class_trait[:hello], trait[:hello], ancestral_trait[:hello]]
  end
end

Foo.trait[:hello] # => "Hello"
foo = Foo.new
foo.trait[:hello] # => "World!"
foo.show          # => ["Hello", "World!", "World!"]

Class Method Summary (collapse)

Instance Method Summary (collapse)

Class Method Details

+ (Object) included(into)



31
32
33
# File '/home/manveru/github/ramaze/ramaze.net/tmp/git/innate/lib/innate/traited.rb', line 31

def self.included(into)
  into.extend(self)
end

Instance Method Details

- (Object) ancestral_trait

Builds a trait from all the ancestors, closer ancestors overwrite distant ancestors

Examples:

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 # => {
  :three => :drei, :two => :zwei, :one => :eins, :first => :overwritten
}


67
68
69
70
71
# File '/home/manveru/github/ramaze/ramaze.net/tmp/git/innate/lib/innate/traited.rb', line 67

def ancestral_trait
  klass = self.kind_of?(Module) ? self : self.class
  ANCESTRAL_TRAITS[klass] ||=
    each_ancestral_trait({}){|hash, trait| hash.update(trait) }
end

- (Object) ancestral_trait_values(key)



73
74
75
76
77
78
# File '/home/manveru/github/ramaze/ramaze.net/tmp/git/innate/lib/innate/traited.rb', line 73

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

- (Object) class_trait

trait for self.class if we are an instance



88
89
90
# File '/home/manveru/github/ramaze/ramaze.net/tmp/git/innate/lib/innate/traited.rb', line 88

def class_trait
  respond_to?(:ancestors) ? trait : self.class.trait
end

- (Object) each_ancestral_trait(obj)



80
81
82
83
84
85
# File '/home/manveru/github/ramaze/ramaze.net/tmp/git/innate/lib/innate/traited.rb', line 80

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

- (Object) trait(hash = nil)



35
36
37
38
39
40
41
42
43
44
45
# File '/home/manveru/github/ramaze/ramaze.net/tmp/git/innate/lib/innate/traited.rb', line 35

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