lib/glimmer/dsl/engine.rb in glimmer-0.8.2 vs lib/glimmer/dsl/engine.rb in glimmer-0.9.0
- old
+ new
@@ -1,6 +1,7 @@
-require 'glimmer'
+require 'facets/string/camelcase'
+
require 'glimmer/dsl/expression_handler'
module Glimmer
module DSL
# Glimmer DSL Engine
@@ -71,53 +72,59 @@
# Every expression has an underscored name corresponding to an upper
# camelcase AbstractExpression subclass name in glimmer/dsl
#
# They are used in order following the Chain of Responsibility Design
# Pattern when interpretting a DSL expression
- def add_dynamic_expressions(dsl_namespace, expression_names)
- dsl = dsl_namespace.name.split("::").last.downcase.to_sym
+ def add_dynamic_expressions(dsl_namespace, *expression_names)
+ expression_names = expression_names.flatten
+ dsl = dsl_namespace.name.split("::").last.downcase.to_sym
dynamic_expression_chains_of_responsibility[dsl] = expression_names.reverse.map do |expression_name|
expression_class(dsl_namespace, expression_name).new
end.reduce(nil) do |last_expresion_handler, expression|
Glimmer::Config.logger&.debug "Adding dynamic expression: #{expression.class.name}"
expression_handler = ExpressionHandler.new(expression)
expression_handler.next = last_expresion_handler if last_expresion_handler
expression_handler
- end
+ end
end
def add_static_expression(static_expression)
Glimmer::Config.logger&.debug "Adding static expression: #{static_expression.class.name}"
keyword = static_expression.class.keyword
static_expression_dsl = static_expression.class.dsl
static_expressions[keyword] ||= {}
static_expressions[keyword][static_expression_dsl] = static_expression
- Glimmer.define_method(keyword) do |*args, &block|
+ Glimmer.send(:define_method, keyword) do |*args, &block|
begin
retrieved_static_expression = Glimmer::DSL::Engine.static_expressions[keyword][Glimmer::DSL::Engine.dsl]
static_expression_dsl = (Glimmer::DSL::Engine.static_expressions[keyword].keys - Glimmer::DSL::Engine.disabled_dsls).first if retrieved_static_expression.nil?
+ interpretation = nil
if retrieved_static_expression.nil? && Glimmer::DSL::Engine.dsl && (static_expression_dsl.nil? || !Glimmer::DSL::Engine.static_expressions[keyword][static_expression_dsl].is_a?(TopLevelExpression))
begin
- return Glimmer::DSL::Engine.interpret(keyword, *args, &block)
+ interpretation = Glimmer::DSL::Engine.interpret(keyword, *args, &block)
rescue => e
Glimmer::DSL::Engine.reset
raise e if static_expression_dsl.nil? || !Glimmer::DSL::Engine.static_expressions[keyword][static_expression_dsl].is_a?(TopLevelExpression)
end
end
- raise Glimmer::Error, "Unsupported keyword: #{keyword}" unless static_expression_dsl || retrieved_static_expression
- Glimmer::DSL::Engine.dsl_stack.push(static_expression_dsl || Glimmer::DSL::Engine.dsl)
- static_expression = Glimmer::DSL::Engine.static_expressions[keyword][Glimmer::DSL::Engine.dsl]
- if !static_expression.can_interpret?(Glimmer::DSL::Engine.parent, keyword, *args, &block)
- raise Error, "Invalid use of Glimmer keyword #{keyword} with args #{args} under parent #{Glimmer::DSL::Engine.parent}"
- else
- Glimmer::Config.logger&.debug "#{static_expression.class.name} will handle expression keyword #{keyword}"
- return static_expression.interpret(Glimmer::DSL::Engine.parent, keyword, *args, &block).tap do |ui_object|
- Glimmer::DSL::Engine.add_content(ui_object, static_expression, &block) unless block.nil?
- Glimmer::DSL::Engine.dsl_stack.pop
+ if interpretation
+ interpretation
+ else
+ raise Glimmer::Error, "Unsupported keyword: #{keyword}" unless static_expression_dsl || retrieved_static_expression
+ Glimmer::DSL::Engine.dsl_stack.push(static_expression_dsl || Glimmer::DSL::Engine.dsl)
+ static_expression = Glimmer::DSL::Engine.static_expressions[keyword][Glimmer::DSL::Engine.dsl]
+ if !static_expression.can_interpret?(Glimmer::DSL::Engine.parent, keyword, *args, &block)
+ raise Error, "Invalid use of Glimmer keyword #{keyword} with args #{args} under parent #{Glimmer::DSL::Engine.parent}"
+ else
+ Glimmer::Config.logger&.debug "#{static_expression.class.name} will handle expression keyword #{keyword}"
+ static_expression.interpret(Glimmer::DSL::Engine.parent, keyword, *args, &block).tap do |ui_object|
+ Glimmer::DSL::Engine.add_content(ui_object, static_expression, &block) unless block.nil?
+ Glimmer::DSL::Engine.dsl_stack.pop
+ end
end
end
- rescue => e
+ rescue StandardError => e
# Glimmer::DSL::Engine.dsl_stack.pop
Glimmer::DSL::Engine.reset
raise e
end
end
@@ -139,10 +146,10 @@
expression = dynamic_expression_chains_of_responsibility[dsl].handle(parent, keyword, *args, &block)
expression.interpret(parent, keyword, *args, &block).tap do |ui_object|
add_content(ui_object, expression, &block)
dsl_stack.pop
end
- rescue => e
+ rescue StandardError => e
# dsl_stack.pop
reset
raise e
end