Sha256: 112591857017081b3c479afdd4478d2827939f24d3183603837aa06b6e33aefa

Contents?: true

Size: 1.49 KB

Versions: 3

Compression:

Stored size: 1.49 KB

Contents

module Lucid
  module AST
    class Walker
      attr_accessor :context
      attr_reader   :runtime

      def initialize(runtime, listeners = [], context = Lucid::Context.default)
        @runtime, @listeners, @context = runtime, listeners, context
      end

      # This is being used to forward on messages from the AST to
      # the formatters.
      def method_missing(message, *args, &block)
        send_message(message, *args, &block)
      end

      def visit_multiline_arg(multiline_arg)
        broadcast(multiline_arg) do
          multiline_arg.accept(self)
        end
      end

      private

      def broadcast(*args, &block)
        message = extract_method_name_from(caller[0])
        send_message message, *args, &block
        self
      end

      def send_message(message, *args, &block)
        return self if Lucid.wants_to_quit
        message = message.to_s.gsub('visit_', '')
        if block_given?
          send_to_listeners("before_#{message}", *args)
          yield if block_given?
          send_to_listeners("after_#{message}", *args)
        else
          send_to_listeners(message, *args)
        end
        self
      end

      def send_to_listeners(message, *args)
        @listeners.each do |listener|
          if listener.respond_to?(message)
            listener.__send__(message, *args)
          end
        end
      end

      def extract_method_name_from(call_stack)
        match = call_stack.match(/in `(.*)'/)
        match.captures[0]
      end

    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
lucid-0.5.1 lib/lucid/ast/walker.rb
lucid-0.4.1 lib/lucid/ast/walker.rb
lucid-0.4.0 lib/lucid/ast/walker.rb