Class: Alki::Dsl::Evaluator

Inherits:
Object
  • Object
show all
Defined in:
lib/alki/dsl/evaluator.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dsl, data) ⇒ Evaluator

Returns a new instance of Evaluator.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/alki/dsl/evaluator.rb', line 14

def initialize(dsl,data)
  @inits = []
  @finishers = []
  @processors = []
  @dsls_seen = Set.new
  @data = data
  @mod = (data[:module] ||= Module.new)
  @dsl = dsl
  evaluator = self
  define_dsl_method :method_missing do |meth,*args,&b|
    evaluator.context.send meth, *args, &b
  end
  process_dsl @dsl
end

Class Method Details

.evaluate(dsl, data = {}, &blk) ⇒ Object



8
9
10
11
12
# File 'lib/alki/dsl/evaluator.rb', line 8

def self.evaluate(dsl, data={}, &blk)
  evaluator = new(dsl,data)
  evaluator.evaluate &blk
  evaluator.finish
end

Instance Method Details

#build(data = {}, &blk) ⇒ Object



29
30
31
# File 'lib/alki/dsl/evaluator.rb', line 29

def build(data={},&blk)
  self.class.evaluate(@dsl,data,&blk)
end

#contextObject



38
39
40
# File 'lib/alki/dsl/evaluator.rb', line 38

def context
  @context
end

#define_dsl_method(name, &blk) ⇒ Object



76
77
78
# File 'lib/alki/dsl/evaluator.rb', line 76

def define_dsl_method(name,&blk)
  @mod.define_singleton_method name, &blk
end

#evaluate(&blk) ⇒ Object



42
43
44
45
# File 'lib/alki/dsl/evaluator.rb', line 42

def evaluate(&blk)
  @context = @data[:context] || block_context(blk)
  @mod.class_exec &blk
end

#finishObject



80
81
82
83
84
85
86
87
88
89
# File 'lib/alki/dsl/evaluator.rb', line 80

def finish
  @finishers.reverse_each(&:call)
  clear_dsl_methods

  if @data.key? :result
    @data[:result]
  else
    @data
  end
end

#process_dsl(dsl) ⇒ Object



33
34
35
36
# File 'lib/alki/dsl/evaluator.rb', line 33

def process_dsl(dsl)
  return unless @dsls_seen.add? dsl
  dsl.generate(self,@data)
end

#require_dsl(source, dsl) ⇒ Object



47
48
49
50
# File 'lib/alki/dsl/evaluator.rb', line 47

def require_dsl(source,dsl)
  dsl_class = Alki.load(dsl)
  dsl_class.new(EvaluatorInstance.new(self,@data))
end

#update(cbs) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/alki/dsl/evaluator.rb', line 52

def update(cbs)
  after_requires = []
  if cbs[:requires]
    cbs[:requires].each do |(required_dsl,order)|
      case order
        when :before
          process_dsl Alki.load(required_dsl)
        when :after
          after_requires << [Alki.load(required_dsl)]
      end
    end
  end
  cbs[:init].call if cbs[:init]
  @finishers << cbs[:finish] if cbs[:finish]
  if cbs[:methods]
    cbs[:methods].each do |name, proc|
      define_dsl_method name, &proc
    end
  end
  after_requires.each do |process_args|
    process_dsl *process_args
  end
end