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