Module: Hooks

Defined in:
lib/baa.rb

Constant Summary collapse

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

Instance Method Summary collapse

Instance Method Details

#_baa_old_name(name) ⇒ Object



58
59
60
# File 'lib/baa.rb', line 58

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

#_baa_rename_method(name) ⇒ Object



53
54
55
56
# File 'lib/baa.rb', line 53

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

#after(*names) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/baa.rb', line 20

def after(*names)
  names.each do |name|
    self._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



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/baa.rb', line 36

def around(*names, pre_method_name)
  names.each do |name|
    self._baa_rename_method(name)
    define_method(name) do |*args, &block|
      self.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



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/baa.rb', line 4

def before(*names)
  names.each do |name|
    self._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