Sha256: 59b18f5dfb612f8783176762fbf2c7dbecf46542fad46b6d873b9ef97e1a5446

Contents?: true

Size: 1.31 KB

Versions: 2

Compression:

Stored size: 1.31 KB

Contents

module Trax
  module Core
    module NamedModule
      # 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])

      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)

        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
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
trax_core-0.0.74 lib/trax/core/named_module.rb
trax_core-0.0.73 lib/trax/core/named_module.rb