Sha256: 841dbc2212adade8cf55864d4fe07d03472562ed4d539c9e78c23b009bbfbe52

Contents?: true

Size: 1.51 KB

Versions: 2

Compression:

Stored size: 1.51 KB

Contents

require 'glimmer/error'
require 'glimmer/swt/widget_proxy'
require 'glimmer/ui/custom_widget'

module Glimmer
  module DSL
    # Represents a StaticExpression for expressions where
    # the keyword does not vary dynamically. These static keywords are then
    # predefined as methods in Glimmer instead of needing method_missing
    #
    # StaticExpression subclasses may optionally implement `#can_interpret?`
    # (not needed if it only checks for keyword)
    #
    # StaticExpression subclasses must define `#interpret`.
    class StaticExpression < Expression
      def self.inherited(base)
        keyword = base.name.split(/::/).last.sub(/Expression$/, '').underscore
        static_expression = base.new
        Glimmer.define_method(keyword) do |*args, &block|
          parent = Glimmer::DSL::Engine.current_parent
          if !static_expression.can_interpret?(parent, keyword, *args, &block)
            raise Error, "Invalid use of Glimmer keyword #{keyword} with args #{args.inspect} under parent #{parent.inspect}"
          else
            Glimmer.logger.debug "#{base.name} will handle expression keyword #{keyword} with arguments #{args}"
            static_expression.interpret(parent, keyword, *args, &block).tap do |ui_object|
              Glimmer::DSL::Engine.add_content(ui_object, static_expression, &block) unless block.nil?
            end
          end
        end
      end

      # Subclasses may optionally implement
      def can_interpret?(parent, keyword, *args, &block)
        true
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
glimmer-0.5.2 lib/glimmer/dsl/static_expression.rb
glimmer-0.5.0 lib/glimmer/dsl/static_expression.rb