Class: Utopia::Controller::Variables

Inherits:
Object
  • Object
show all
Defined in:
lib/utopia/controller/variables.rb

Overview

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

Instance Method Summary collapse

Constructor Details

#initializeVariables

Returns a new instance of Variables.



25
26
27
# File 'lib/utopia/controller/variables.rb', line 25

def initialize
  @controllers = []
end

Instance Method Details

#<<(controller) ⇒ Object



33
34
35
36
37
38
39
40
41
42
# File 'lib/utopia/controller/variables.rb', line 33

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) ⇒ Object



75
76
77
# File 'lib/utopia/controller/variables.rb', line 75

def [] key
  fetch("@#{key}".to_sym, nil)
end

#fetch(key, default = self) ⇒ Object

We use self as a seninel



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/utopia/controller/variables.rb', line 45

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_hashObject



61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/utopia/controller/variables.rb', line 61

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

#topObject



29
30
31
# File 'lib/utopia/controller/variables.rb', line 29

def top
  @controllers.last
end