Module: MuchMixin::ClassMethods

Defined in:
lib/much-mixin.rb

Instance Method Summary collapse

Instance Method Details

#after_mixin_included(&block) ⇒ Object Also known as: after_plugin_included



81
82
83
# File 'lib/much-mixin.rb', line 81

def after_mixin_included(&block)
  self.much_plugin_after_included_blocks << block
end

#included(plugin_receiver) ⇒ Object

install an included block that first checks if this plugin’s receiver mixin 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(plugin_receiver)
  return if plugin_receiver.include?(self.much_mixin_included_detector)
  plugin_receiver.send(:include, self.much_mixin_included_detector)

  self.much_mixin_included_blocks.each do |block|
    plugin_receiver.class_eval(&block)
  end

  self.much_plugin_class_method_blocks.each do |block|
    self.much_mixin_class_methods_module.class_eval(&block)
  end
  plugin_receiver.send(:extend, self.much_mixin_class_methods_module)

  self.much_plugin_instance_method_blocks.each do |block|
    self.much_mixin_instance_methods_module.class_eval(&block)
  end
  plugin_receiver.send(:include, self.much_mixin_instance_methods_module)

  self.much_plugin_after_included_blocks.each do |block|
    plugin_receiver.class_eval(&block)
  end
end

#mixin_class_methods(&block) ⇒ Object Also known as: plugin_class_methods



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

def mixin_class_methods(&block)
  self.much_plugin_class_method_blocks << block
end

#mixin_included(&block) ⇒ Object Also known as: plugin_included



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

def mixin_included(&block)
  self.much_mixin_included_blocks << block
end

#mixin_instance_methods(&block) ⇒ Object Also known as: plugin_instance_methods



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

def mixin_instance_methods(&block)
  self.much_plugin_instance_method_blocks << block
end

#much_mixin_class_methods_moduleObject



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

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

#much_mixin_included_blocksObject



60
61
62
# File 'lib/much-mixin.rb', line 60

def much_mixin_included_blocks
  @much_mixin_included_blocks ||= []
end

#much_mixin_included_detectorObject

the included detector is an empty module that is only used to detect if the plugin has been included or not, it doesn’t add any behavior or methods to the object receiving the plugin; we use ‘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
# File 'lib/much-mixin.rb', line 42

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

#much_mixin_instance_methods_moduleObject



54
55
56
57
58
# File 'lib/much-mixin.rb', line 54

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

#much_plugin_after_included_blocksObject



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

def much_plugin_after_included_blocks
  @much_plugin_after_included_blocks ||= []
end

#much_plugin_class_method_blocksObject



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

def much_plugin_class_method_blocks
  @much_plugin_class_method_blocks ||= []
end

#much_plugin_instance_method_blocksObject



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

def much_plugin_instance_method_blocks
  @much_plugin_instance_method_blocks ||= []
end