Module: Innate::Traited

### Home Classes Methods

### In Files

- lib/innate/traited.rb

### Methods

- ::included
- #ancestral_trait
- #ancestral_trait_values
- #class_trait
- #each_ancestral_trait
- #trait

### Class/Module Index

Quicksearch

- Innate
- Innate::Action
- Innate::Adapter
- Innate::Cache
- Innate::Cache::API
- Innate::Cache::DRb
- Innate::Cache::FileBased
- Innate::Cache::Marshal
- Innate::Cache::Memory
- Innate::Cache::YAML
- Innate::Current
- Innate::Etanni
- Innate::Helper
- Innate::Helper::Aspect
- Innate::Helper::Aspect::SingletonMethods
- Innate::Helper::CGI
- Innate::Helper::Flash
- Innate::Helper::Link
- Innate::Helper::Redirect
- Innate::Helper::Render
- Innate::HelperAccess
- Innate::HelpersHelper
- Innate::LRUHash
- Innate::LogHub
- Innate::Mock
- Innate::Mock::Session
- Innate::Node
- Innate::Optioned
- Innate::Optioned::SingletonMethods
- Innate::Options
- Innate::Request
- Innate::Response
- Innate::Rewrite
- Innate::Route
- Innate::Session
- Innate::Session::Flash
- Innate::SingletonMethods
- Innate::StateAccessor
- Innate::Traited
- Innate::Trinity
- Innate::URLMap
- Innate::View
- Innate::View::ERB
- Innate::View::Etanni
- Innate::View::None
- Logger
- Logger::ColorFormatter
- Object

No matching classes.

# Innate::Traited

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 {Traited#ancestral_trait} you will get nicely inherited configuration, where keys later in the ancestors will take precedence.

@example 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!"]

### Constants

ANCESTRAL_VALUES

### Public Class Methods

included(into) click to toggle source

    # File lib/innate/traited.rb, line 31
    def self.included(into)
      into.extend(self)
    end

### Public Instance Methods

ancestral_trait() click to toggle source

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

@example

    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
    }

    # File 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

ancestral_trait_values(key) click to toggle source

    # File 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

class_trait() click to toggle source

trait for self.class if we are an instance

    # File lib/innate/traited.rb, line 88
    def class_trait
      respond_to?(:ancestors) ? trait : self.class.trait
    end

each_ancestral_trait(obj) click to toggle source

    # File 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

trait(hash = nil) click to toggle source

    # File 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

[Validate]

Generated with the Darkfish Rdoc Generator 2.