class Utopia::Controller::Variables

Provides a stack-based instance variable lookup mechanism. It can flatten a stack of controllers into a single hash.

Public Class Methods

new() click to toggle source
# File lib/utopia/controller/variables.rb, line 27
def initialize
        @controllers = []
end

Public Instance Methods

<<(controller) click to toggle source
# File lib/utopia/controller/variables.rb, line 35
def << controller
        if top = self.top
                # This ensures that most variables will be at the top and controllers can naturally interactive with instance variables:
                controller.copy_instance_variables(top)
        end
        
        @controllers << controller
        
        return self
end
[](key) click to toggle source
# File lib/utopia/controller/variables.rb, line 77
def [] key
        fetch("@#{key}".to_sym, nil)
end
fetch(key, default=self) { |key| ... } click to toggle source

We use self as a seninel

# File lib/utopia/controller/variables.rb, line 47
def fetch(key, default=self)
        if controller = self.top
                if controller.instance_variables.include?(key)
                        return controller.instance_variable_get(key)
                end
        end
        
        if block_given?
                yield(key)
        elsif !default.equal?(self)
                return default
        else
                raise KeyError.new(key)
        end
end
to_hash() click to toggle source
# File lib/utopia/controller/variables.rb, line 63
def to_hash
        attributes = {}
        
        if controller = self.top
                controller.instance_variables.each do |name|
                        key = name[1..-1].to_sym
                        
                        attributes[key] = controller.instance_variable_get(name)
                end
        end
        
        return attributes
end
top() click to toggle source
# File lib/utopia/controller/variables.rb, line 31
def top
        @controllers.last
end