Module: MuchMixin::ClassMethods

Defined in:
lib/much-mixin.rb

Instance Method Summary collapse

Instance Method Details

#after_mixin_included(&block) ⇒ Object



83
84
85
# File 'lib/much-mixin.rb', line 83

def after_mixin_included(&block)
  much_mixin_after_included_blocks << block
end

#included(mixin_receiver) ⇒ Object

Install an included block that first checks if the mix-in has already been included. If it has not been, include the receiver mixin and run all of the mixin_included blocks.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/much-mixin.rb', line 14

def included(mixin_receiver)
  return if mixin_receiver.include?(much_mixin_included_detector)
  mixin_receiver.send(:include, much_mixin_included_detector)

  much_mixin_included_blocks.each do |block|
    mixin_receiver.class_eval(&block)
  end

  much_mixin_class_method_blocks.each do |block|
    much_mixin_class_methods_module.class_eval(&block)
  end
  mixin_receiver.send(:extend, much_mixin_class_methods_module)

  much_mixin_instance_method_blocks.each do |block|
    much_mixin_instance_methods_module.class_eval(&block)
  end
  mixin_receiver.send(:include, much_mixin_instance_methods_module)

  much_mixin_after_included_blocks.each do |block|
    mixin_receiver.class_eval(&block)
  end
end

#mixin_class_methods(&block) ⇒ Object



87
88
89
# File 'lib/much-mixin.rb', line 87

def mixin_class_methods(&block)
  much_mixin_class_method_blocks << block
end

#mixin_included(&block) ⇒ Object



79
80
81
# File 'lib/much-mixin.rb', line 79

def mixin_included(&block)
  much_mixin_included_blocks << block
end

#mixin_instance_methods(&block) ⇒ Object



91
92
93
# File 'lib/much-mixin.rb', line 91

def mixin_instance_methods(&block)
  much_mixin_instance_method_blocks << block
end

#much_mixin_after_included_blocks ⇒ Object



67
68
69
# File 'lib/much-mixin.rb', line 67

def much_mixin_after_included_blocks
  @much_mixin_after_included_blocks ||= []
end

#much_mixin_class_method_blocks ⇒ Object



71
72
73
# File 'lib/much-mixin.rb', line 71

def much_mixin_class_method_blocks
  @much_mixin_class_method_blocks ||= []
end

#much_mixin_class_methods_module ⇒ Object



49
50
51
52
53
54
# File 'lib/much-mixin.rb', line 49

def much_mixin_class_methods_module
  @much_mixin_class_methods_module ||=
    Module.new.tap do |m|
      const_set("MuchMixinClassMethods", m)
    end
end

#much_mixin_included_blocks ⇒ Object



63
64
65
# File 'lib/much-mixin.rb', line 63

def much_mixin_included_blocks
  @much_mixin_included_blocks ||= []
end

#much_mixin_included_detector ⇒ Object

The included detector is an empty module that is only used to detect if the mix-in has been included or not. It doesn't add any behavior or methods to the receiver and uses const_set to name the module so if its seen in the ancestors it doesn't look like some random module and it can be tracked back to much-mixin.



42
43
44
45
46
47
# File 'lib/much-mixin.rb', line 42

def much_mixin_included_detector
  @much_mixin_included_detector ||=
    Module.new.tap do |m|
      const_set("MuchMixinIncludedDetector", m)
    end
end

#much_mixin_instance_method_blocks ⇒ Object



75
76
77
# File 'lib/much-mixin.rb', line 75

def much_mixin_instance_method_blocks
  @much_mixin_instance_method_blocks ||= []
end

#much_mixin_instance_methods_module ⇒ Object



56
57
58
59
60
61
# File 'lib/much-mixin.rb', line 56

def much_mixin_instance_methods_module
  @much_mixin_instance_methods_module ||=
    Module.new.tap do |m|
      const_set("MuchMixinInstanceMethods", m)
    end
end