class Minicontext::Context

Constants

COMPOSE
KEYWORD
RELAY

Public Class Methods

new(parent = nil) click to toggle source
# File lib/minicontext/context.rb, line 7
def initialize(parent = nil)
  @vars   = {}
  @parent = parent
end

Public Instance Methods

[](name) click to toggle source
# File lib/minicontext/context.rb, line 53
def [](name)
  router[name]
end
[]=(name, val) click to toggle source
# File lib/minicontext/context.rb, line 57
def []=(name, val)
  raise AssignError, name if @vars[name]

  @vars[name] = val
end
action(&block) click to toggle source
# File lib/minicontext/context.rb, line 37
def action(&block)
  instance_eval &block
end
call(name) click to toggle source
# File lib/minicontext/context.rb, line 45
def call(name)
  Proc === (val = @vars[name]) ? apply(name) : val
end
context(name, &block) click to toggle source
# File lib/minicontext/context.rb, line 12
def context(name, &block)
  raise AssignError, name if KEYWORD.include?(name)
  raise AssignError, name if (val = @vars[name]) && Proc === val

  val ? val.action(&block) : define_context(name, &block)
end
let(name, &block) click to toggle source
# File lib/minicontext/context.rb, line 23
def let(name, &block)
  raise AssignError, name if KEYWORD.include?(name)

  self[name] = -> (env) do
    env.memoized.fetch([self, name]) do
      env.memoized[[self, name]] = env.(self, &block)
    end
  end
end
load(filename) click to toggle source
# File lib/minicontext/context.rb, line 41
def load(filename)
  instance_eval open(filename) {|f| f.read}, filename
end
lookup(name) click to toggle source
# File lib/minicontext/context.rb, line 49
def lookup(name)
  Proc === (val = @vars[name]) ? val : (@parent && @parent.lookup(name))
end
task(name, &block) click to toggle source
# File lib/minicontext/context.rb, line 19
def task(name, &block)
  self[name] = -> (env) { env.(self, &block) }
end

Private Instance Methods

apply(name) click to toggle source
# File lib/minicontext/context.rb, line 72
def apply(name)
  compose(@vars[name])
end
compose(f) click to toggle source
# File lib/minicontext/context.rb, line 76
def compose(f)
  g = COMPOSE.(@vars[:after] || RELAY, COMPOSE.(f, @vars[:before] || RELAY))

  @parent ? @parent.send(:compose, g) : g
end
define_context(name, &block) click to toggle source
# File lib/minicontext/context.rb, line 65
def define_context(name, &block)
  self.class.new(self).tap do |ctx|
    self[name] = ctx
    ctx.action &block
  end
end
router() click to toggle source
# File lib/minicontext/context.rb, line 82
def router
  Router::Maybe.new(self)
end