Module: Freightrain::SignalHost

Included in:
FreightService, FreightView, FreightViewModel
Defined in:
lib/freightrain/signals/signal_host.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(klass) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/freightrain/signals/signal_host.rb', line 6

def self.extended(klass)

  klass.class_eval do

    def fire(signal, *args)
      @signals[signal.to_sym].fire(*args)
    end
    
    def signals
      return @signals
    end
    
    def create_signals
      @signals = {}
      signals = self.class.instance_variable_get(:@signals)
      signals ||= {}
      signals.keys.each do |signal|
        create_forward_method(signals[signal][:forwards], signal) if signals[signal]
        @signals[signal] = FreightSignal.new
      end
    end

    def create_forward_method(target_description, signal)
      target = target_description.split(".")[0]
      event  = target_description.split(".")[1]
      self.class.send(:define_method, "#{target}_on_#{event}") do
        fire signal.to_sym
      end
    end

    def hook_to_signals(host, prefix = nil)
      @signals.each do |signal_key, signal|
        method_name = "on_#{signal_key}"
        method_name = "#{prefix}_#{method_name}" if prefix
        signal.connect(host.method(method_name)) if host.respond_to?(method_name)
      end
    end
    
  end
end

Instance Method Details

#signal(signal_name, options = nil) ⇒ Object



47
48
49
50
# File 'lib/freightrain/signals/signal_host.rb', line 47

def signal(signal_name, options = nil)
  @signals ||= {}
  @signals[signal_name.to_sym] = options
end