Class: MotionSupport::Callbacks::Callback

Inherits:
Object
  • Object
show all
Defined in:
motion/callbacks.rb

Overview

:nodoc:#

Constant Summary collapse

@@_callback_sequence =
0

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(chain, filter, kind, options, klass) ⇒ Callback

Returns a new instance of Callback


89
90
91
92
93
94
95
96
# File 'motion/callbacks.rb', line 89

def initialize(chain, filter, kind, options, klass)
  @chain, @kind, @klass = chain, kind, klass
  normalize_options!(options)

  @raw_filter, @options = filter, options
  @filter               = _compile_filter(filter)
  recompile_options!
end

Instance Attribute Details

#chainObject

Returns the value of attribute chain


87
88
89
# File 'motion/callbacks.rb', line 87

def chain
  @chain
end

#filterObject

Returns the value of attribute filter


87
88
89
# File 'motion/callbacks.rb', line 87

def filter
  @filter
end

#kindObject

Returns the value of attribute kind


87
88
89
# File 'motion/callbacks.rb', line 87

def kind
  @kind
end

#klassObject

Returns the value of attribute klass


87
88
89
# File 'motion/callbacks.rb', line 87

def klass
  @klass
end

#optionsObject

Returns the value of attribute options


87
88
89
# File 'motion/callbacks.rb', line 87

def options
  @options
end

#raw_filterObject

Returns the value of attribute raw_filter


87
88
89
# File 'motion/callbacks.rb', line 87

def raw_filter
  @raw_filter
end

Instance Method Details

#_update_filter(filter_options, new_options) ⇒ Object


129
130
131
132
# File 'motion/callbacks.rb', line 129

def _update_filter(filter_options, new_options)
  filter_options[:if].concat(Array(new_options[:unless])) if new_options.key?(:unless)
  filter_options[:unless].concat(Array(new_options[:if])) if new_options.key?(:if)
end

#apply(code) ⇒ Object

Wraps code with filter


141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# File 'motion/callbacks.rb', line 141

def apply(code)
  case @kind
  when :before
    lambda do |obj, value, halted|
      if !halted && @compiled_options.call(obj)
        result = @filter.call(obj)
        
        halted = chain.config[:terminator].call(result)
        if halted
          obj.halted_callback_hook(@raw_filter.inspect)
        end
      end
      code.call(obj, value, halted)
    end
  when :after
    lambda do |obj, value, halted|
      value, halted = *(code.call(obj, value, halted))
      if (!chain.config[:skip_after_callbacks_if_terminated] || !halted) && @compiled_options.call(obj)
        @filter.call(obj)
      end
      [value, halted]
    end
  when :around
    lambda do |obj, value, halted|
      if @compiled_options.call(obj) && !halted
        @filter.call(obj) do
          value, halted = *(code.call(obj, value, halted))
          value
        end
      else
        value, halted = *(code.call(obj, value, halted))
        value
      end
      [value, halted]
    end
  end
end

#clone(chain, klass) ⇒ Object


98
99
100
101
102
103
104
105
106
# File 'motion/callbacks.rb', line 98

def clone(chain, klass)
  obj                  = super()
  obj.chain            = chain
  obj.klass            = klass
  obj.options          = @options.dup
  obj.options[:if]     = @options[:if].dup
  obj.options[:unless] = @options[:unless].dup
  obj
end

#duplicates?(other) ⇒ Boolean

Returns:

  • (Boolean)

125
126
127
# File 'motion/callbacks.rb', line 125

def duplicates?(other)
  matches?(other.kind, other.raw_filter)
end

#matches?(_kind, _filter) ⇒ Boolean

Returns:

  • (Boolean)

121
122
123
# File 'motion/callbacks.rb', line 121

def matches?(_kind, _filter)
  @kind == _kind && @raw_filter == _filter
end

#nameObject


113
114
115
# File 'motion/callbacks.rb', line 113

def name
  chain.name
end

#next_idObject


117
118
119
# File 'motion/callbacks.rb', line 117

def next_id
  @@_callback_sequence += 1
end

#normalize_options!(options) ⇒ Object


108
109
110
111
# File 'motion/callbacks.rb', line 108

def normalize_options!(options)
  options[:if] = Array(options[:if])
  options[:unless] = Array(options[:unless])
end

#recompile!(_options) ⇒ Object


134
135
136
137
138
# File 'motion/callbacks.rb', line 134

def recompile!(_options)
  _update_filter(self.options, _options)

  recompile_options!
end