lib/hyperstack/internal/callbacks.rb in hyper-state-1.0.alpha1.5 vs lib/hyperstack/internal/callbacks.rb in hyper-state-1.0.alpha1.6

- old
+ new

@@ -10,32 +10,33 @@ base.extend(ClassMethods) end def run_callback(name, *args) self.class.callbacks_for(name).flatten.each do |callback| - result = if callback.is_a?(Proc) - instance_exec(*args, &callback) - else - send(callback, *args) - end - args = yield(result) if block_given? + callback = method(callback) unless callback.is_a? Proc + args = self.class.send("_#{name}_before_call_hook", name, self, callback, *args) end args end module ClassMethods - def define_callback(callback_name, &after_define_hook) + def define_callback(callback_name, before_call_hook: nil, after_define_hook: nil) wrapper_name = "_#{callback_name}_callbacks" define_singleton_method(wrapper_name) do Context.set_var(self, "@#{wrapper_name}", force: true) { [] } end + before_call_hook ||= lambda do |_name, sself, proc, *args| + sself.instance_exec(*args, &proc) + args + end + define_singleton_method("_#{callback_name}_before_call_hook", &before_call_hook) define_singleton_method(callback_name) do |*args, &block| args << block if block_given? send(wrapper_name).push args Hotloader.when_file_updates do send(wrapper_name).delete_if { |item| item.equal? args } end - after_define_hook.call(*args, &block) if after_define_hook + after_define_hook.call(self) if after_define_hook end end def callbacks_for(callback_name) wrapper_name = "_#{callback_name}_callbacks"