lib/hyperstack/internal/callbacks.rb in hyper-state-1.0.alpha1.2 vs lib/hyperstack/internal/callbacks.rb in hyper-state-1.0.alpha1.3

- old
+ new

@@ -1,37 +1,41 @@ module Hyperstack module Internal module Callbacks if RUBY_ENGINE != 'opal' class Hyperstack::Hotloader - def self.record(*args); end + def self.when_file_updates(&block); end end end def self.included(base) base.extend(ClassMethods) end def run_callback(name, *args) - self.class.callbacks_for(name).each do |callback| - if callback.is_a?(Proc) - instance_exec(*args, &callback) - else - send(callback, *args) - end + 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? end + args end module ClassMethods def define_callback(callback_name, &after_define_hook) wrapper_name = "_#{callback_name}_callbacks" define_singleton_method(wrapper_name) do Context.set_var(self, "@#{wrapper_name}", force: true) { [] } end define_singleton_method(callback_name) do |*args, &block| - send(wrapper_name).concat(args) - send(wrapper_name).push(block) if block_given? - Hotloader.record(self, "@#{wrapper_name}", 4, *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 end end def callbacks_for(callback_name) @@ -39,9 +43,13 @@ if superclass.respond_to? :callbacks_for superclass.callbacks_for(callback_name) else [] end + send(wrapper_name) + end + + def callbacks?(name) + callbacks_for(name).any? end end end end end