Module: BBLib::Hooks

Included in:
LazyClass
Defined in:
lib/object/hooks.rb

Instance Method Summary collapse

Instance Method Details

#add_after_hook(method, hook) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
# File 'lib/object/hooks.rb', line 57

def add_after_hook method, hook
  after_hooked_methods[hook] = Array.new unless after_hooked_methods[hook]
  after_hooked_methods[hook] += [method]
  original = instance_method(method)

  define_method(method) do |*args, &block|
    rtr = original.bind(self).call(*args, &block)
    method(hook).call
    rtr
  end
end

#add_before_hook(method, hook) ⇒ Object



30
31
32
33
34
35
36
37
38
39
# File 'lib/object/hooks.rb', line 30

def add_before_hook method, hook
  before_hooked_methods[hook] = Array.new unless before_hooked_methods[hook]
  before_hooked_methods[hook] += [method]
  original = instance_method(method)
  define_method(method) do |*args, &block|
    # puts "ARGS: #{args}"

    method(hook).call
    original.bind(self).call(*args, &block)
  end
end

#after(hook, *methods) ⇒ Object



41
42
43
# File 'lib/object/hooks.rb', line 41

def after hook, *methods
  methods.each{ |m| after_hooks[hook] = methods }
end

#after_hooked_methodsObject



49
50
51
# File 'lib/object/hooks.rb', line 49

def after_hooked_methods
  @after_hooked_methods ||= {}
end

#after_hooksObject



45
46
47
# File 'lib/object/hooks.rb', line 45

def after_hooks
  @after_hooks ||= {}
end

#after_hooks_for(name) ⇒ Object



53
54
55
# File 'lib/object/hooks.rb', line 53

def after_hooks_for name
  after_hooks.map{ |n, m| m.include?(name) ? n : nil }.reject(&:nil?)
end

#before(hook, *methods) ⇒ Object



14
15
16
# File 'lib/object/hooks.rb', line 14

def before hook, *methods
  methods.each{ |m| before_hooks[hook] = methods }
end

#before_hooked_methodsObject



22
23
24
# File 'lib/object/hooks.rb', line 22

def before_hooked_methods
  @before_hooked_methods ||= {}
end

#before_hooksObject



18
19
20
# File 'lib/object/hooks.rb', line 18

def before_hooks
  @before_hooks ||= {}
end

#before_hooks_for(name) ⇒ Object



26
27
28
# File 'lib/object/hooks.rb', line 26

def before_hooks_for name
  before_hooks.map{ |n, m| m.include?(name)? n : nil }.reject(&:nil?)
end

#method_added(name) ⇒ Object



3
4
5
6
7
8
9
10
11
12
# File 'lib/object/hooks.rb', line 3

def method_added name
  before_hooks_for(name).each do |hook|
    next if before_hooked_methods[hook] && before_hooked_methods[hook].include?(name)
    add_before_hook(name, hook)
  end
  after_hooks_for(name).each do |hook|
    next if after_hooked_methods[hook] && after_hooked_methods[hook].include?(name)
    add_after_hook(name, hook)
  end
end