Module: Trax::Core::NamedModule

Defined in:
lib/trax/core/named_module.rb

Class Method Summary collapse

Class Method Details

.new(_name, *_extensions, **options, &block) ⇒ Object

examples: (by default, any module args passed after the name of the module will be applied via extend) With Args: Trax::Core::NamedModule.new(“Ecommerce::ItemExtensions”, ::Ecommerce::PricingExtension, Ecommerce::ShippingExtension) With :extensions keyword Trax::Core::NamedModule.new(“Ecommerce::ItemExtensions”, :extensions => [::Ecommerce::PricingExtension]) With :includes keyword Trax::Core::NamedModule.new(“Ecommerce::ItemExtensions”, :includes => [::Ecommerce::ShippingExtension])



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/trax/core/named_module.rb', line 12

def self.new(_name, *_extensions, **options, &block)
  module_object = ::Object.set_fully_qualified_constant(_name, ::Module.new do
    define_singleton_method(:name) do
      _name
    end
  end)

  options.each_pair do |k,v|
    module_object.instance_variable_set("@#{k}", v)
    module_object.singleton_class.__send__(:attr_reader, k)
  end unless options.blank?

  module_object.module_eval(&block) if block_given?

  includes = [options.extract!(:includes).fetch(:includes) { nil }].compact.flatten
  extensions = [options.extract!(:extensions).fetch(:extensions) { nil }, _extensions].compact.flatten

  extensions.each_with_object(module_object) { |ext, mod| mod.extend(ext) } if extensions.length
  includes.each_with_object(module_object){ |ext, mod| mod.include(ext) } if includes.length

  module_object
end