Module: Hooks

Defined in:
lib/baa.rb

Overview

Hooks

Instance Method Summary collapse

Instance Method Details

#_baa_hooksObject



3
4
5
6
7
8
9
# File 'lib/baa.rb', line 3

def _baa_hooks
  @_baa_hooks ||= {
    before: [],
    after: [],
    around: []
  }
end

#_baa_old_name(name) ⇒ Object



70
71
72
# File 'lib/baa.rb', line 70

def _baa_old_name(name)
  "_baa_#{name}".to_sym
end

#_baa_rename_method(name) ⇒ Object



63
64
65
66
67
68
# File 'lib/baa.rb', line 63

def _baa_rename_method(name)
  if _baa_hooks.values.flatten.include? name
    fail HookExistsError, "Method (:#{name}) already has hooks applied\n#{_baa_hooks}"
  end
  alias_method _baa_old_name(name), name
end

#after(*names) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/baa.rb', line 27

def after(*names)
  names.each do |name|
    _baa_rename_method(name)
    define_method(name) do |*args, &block|
      if args.any?
        send(self.class._baa_old_name(name), args, &block)
      else
        send(self.class._baa_old_name(name), &block)
      end
      yield
    end
    _baa_hooks[:after] << name
  end
  _baa_hooks
end

#around(*names, pre_method_name) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/baa.rb', line 43

def around(*names, pre_method_name)
  names.each do |name|
    _baa_rename_method(name)
    define_method(name) do |*args, &block|
      send(pre_method_name)
      if args.any?
        send(self.class._baa_old_name(name), args, &block)
      else
        send(self.class._baa_old_name(name), &block)
      end
      yield
    end
    _baa_hooks[:around] << name
  end
  _baa_hooks
end

#before(*names) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/baa.rb', line 11

def before(*names)
  names.each do |name|
    _baa_rename_method(name)
    define_method(name) do |*args, &block|
      yield
      if args.any?
        send(self.class._baa_old_name(name), args, &block)
      else
        send(self.class._baa_old_name(name), &block)
      end
    end
    _baa_hooks[:before] << name
  end
  _baa_hooks
end