Module: Legion::Extensions::Builder::Actors

Includes:
Base
Included in:
Core
Defined in:
lib/legion/extensions/builders/actors.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Base

#const_defined_two?, #define_constant_two, #define_get, #find_files, #require_files

Instance Attribute Details

#actorsObject (readonly)

Returns the value of attribute actors.



11
12
13
# File 'lib/legion/extensions/builders/actors.rb', line 11

def actors
  @actors
end

Instance Method Details

#actor_filesObject



67
68
69
# File 'lib/legion/extensions/builders/actors.rb', line 67

def actor_files
  @actor_files ||= find_files('actors')
end

#build_actor_listObject



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/legion/extensions/builders/actors.rb', line 20

def build_actor_list
  actor_files.each do |file|
    actor_name = file.split('/').last.sub('.rb', '')
    actor_class = "#{lex_class}::Actor::#{actor_name.split('_').collect(&:capitalize).join}"
    unless Kernel.const_defined?(actor_class)
      Legion::Logging.warn "[Actors] constant #{actor_class} not defined, skipping" if defined?(Legion::Logging)
      next
    end
    log.info "[Actors] built actor: #{actor_class}" if defined?(Legion::Logging)
    @actors[actor_name.to_sym] = {
      extension:      lex_class.to_s.downcase,
      extension_name: extension_name,
      actor_name:     actor_name,
      actor_class:    Kernel.const_get(actor_class),
      type:           'literal'
    }
  end
end

#build_actorsObject



13
14
15
16
17
18
# File 'lib/legion/extensions/builders/actors.rb', line 13

def build_actors
  @actors = {}
  require_files(actor_files)
  build_actor_list
  build_meta_actor_list
end

#build_meta_actor(runner, attr) ⇒ Object



60
61
62
63
64
65
# File 'lib/legion/extensions/builders/actors.rb', line 60

def build_meta_actor(runner, attr)
  define_constant_two('Actor', root: lex_class)

  Kernel.const_get("#{attr[:extension_class]}::Actor")
        .const_set(runner.to_s.split('_').collect(&:capitalize).join, Class.new(Legion::Extensions::Actors::Subscription))
end

#build_meta_actor_listObject



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/legion/extensions/builders/actors.rb', line 39

def build_meta_actor_list
  if lex_class.respond_to?(:remote_invocable?) && !lex_class.remote_invocable?
    log.debug "[Actors] skipping meta actors for #{lex_class} (remote_invocable=false)"
    return
  end

  @runners.each do |runner, attr|
    next if @actors[runner.to_sym].is_a? Hash

    actor_class = "#{attr[:extension_class]}::Actor::#{runner.to_s.split('_').collect(&:capitalize).join}"
    build_meta_actor(runner, attr) unless Kernel.const_defined? actor_class
    @actors[runner.to_sym] = {
      extension:      attr[:extension],
      extension_name: attr[:extension_name],
      actor_name:     attr[:runner_name],
      actor_class:    Kernel.const_get(actor_class),
      type:           'meta'
    }
  end
end