module Tengine::Core::Driveable::ClassMethods

Public Instance Methods

driver() click to toggle source
# File lib/tengine/core/driveable.rb, line 112
def driver
  unless @driver
    driver_attrs = {
      :name => self.driver_name, # self.name.gsub(/:/, 'Colon'),
      :version => Tengine::Core::Setting.dsl_version
    }
    @driver = Tengine::Core::Driver.where(driver_attrs).first
  end
  @driver
end
driver_name() click to toggle source
# File lib/tengine/core/driveable.rb, line 107
def driver_name
  return nil if self.name.nil?
  (self < Tengine::Core::Driveable::ByDsl) ? self.name.underscore : self.name
end
on(*args, &block) click to toggle source
# File lib/tengine/core/driveable.rb, line 127
def on(*args, &block)
  context = @__context__ || self
  options = args.extract_options!
  event_type_names = args
  if block
    filepath, lineno = *block.source_location
    filepath = context.config.relative_path_from_dsl_dir(filepath.dup.force_encoding(Encoding.default_external).freeze)
    options.update(:filepath => filepath, :lineno => lineno)
    filter_def = nil
    handler = nil
    if event_type_names.length == 1 && event_type_names.first.is_a?(Tengine::Core::DslFilterDef)
      filter_def = event_type_names.first
      options[:filter] = filter_def.filter
      event_type_names = filter_def.event_type_names
      base_method_name = event_type_names.map(&:to_s).join("_")
      driver = context.driver

      driver.reload
      method_name = filter_def.to_method_name
      attrs = {
        :target_method_name => method_name,
        :event_type_names => event_type_names,
        # :target_instantiation_key => :instance_method, # attrsを検索にも使うので_cdの方を指定しています
        :target_instantiation_cd => Tengine::Core::Handler.target_instantiation_id_by_key(:instance_method),
      } # .update(options)
      handler = driver.handlers.find_or_initialize_by(attrs)
      options.each{|k,v| handler.send("#{k}=", v)}
      handler.save!

      event_type_names.each do |event_type_name|
        driver.handler_paths.find_or_create_by(:event_type_name => event_type_name, :handler_id => handler.id)
      end
    else
      method_name = event_type_names.map(&:to_s).join("_")
      context.__on_args__ = event_type_names.map(&:to_s) + [options]
    end
    case block.arity
    when 1 then
      define_method(method_name, &block)
    when 0 then
      impl_method_name = "__#{method_name}_impl__"
      self.instance_eval do
        define_method(method_name) do |event|
          @__event__ = event
          begin
            send(impl_method_name)
          ensure
            @__event__ = nil
          end
        end
        define_method(impl_method_name, &block)
      end
    else
      raise Tengine::Core::DslError, "#{block.artity} aritties block given"
    end
    # handler.save! if handler
  else
    filepath, lineno = *caller.first.sub(/:in.+\Z/, '').split(/:/, 2)
    options.update(:filepath => filepath, :lineno => lineno)
    context.__on_args__ = ( args + [options] )
  end
end
session() click to toggle source
# File lib/tengine/core/driveable.rb, line 123
def session
  @__session_wrapper__ ||= Tengine::Core::SessionWrapper.new(driver.session)
end