class VG::SO::GenerateIncludableModule::Action

Attributes

desired_method_name[R]
so_module_name[RW]

Public Instance Methods

call(so_module_name, as: nil) click to toggle source
# File lib/vg/s_o/generate_includable_module.rb, line 13
def call(so_module_name, as: nil)
  self.desired_method_name = as
  self.so_module_name = so_module_name
  find_or_define_module
end

Private Instance Methods

define_module() click to toggle source
# File lib/vg/s_o/generate_includable_module.rb, line 35
        def define_module
          instance_eval <<~RUBY
            module #{module_name}
              def self.included(base)
                InjectRegistrationMethods.call(base)
                base.register_service_object(:#{method_name}, ::#{so_module_name})
              end

              def #{method_name}_fn
                self.class.registered_service_objects[:#{method_name}].callable
              end

              def #{method_name}(...)
                send("#{method_name}_fn").call(...)
              end

              def #{method_name}!(...)
                result = send("#{method_name}_fn").call(...)
                return result unless result.respond_to?(:error) && result.respond_to?(:value)
                raise result.error if result.error
                result.value
              end

              def self.extended(_base)
                raise "Do not extend ::#{so_module_name}, use include!"
              end
            end
          RUBY
          Object.const_get(module_name)
        end
desired_method_name=(name) click to toggle source
# File lib/vg/s_o/generate_includable_module.rb, line 24
def desired_method_name=(name)
  # TODO: ensure name is a string in snake case; no bangs;
  @desired_method_name = name.to_s
end
find_or_define_module() click to toggle source
# File lib/vg/s_o/generate_includable_module.rb, line 29
def find_or_define_module 
  return Object.const_get(module_name) if Object.const_defined?(module_name)

  define_module
end
method_name() click to toggle source
# File lib/vg/s_o/generate_includable_module.rb, line 66
def method_name
  @method_name ||= desired_method_name || GenerateSlugFromModuleName.call(so_module_name)
end
module_name() click to toggle source
# File lib/vg/s_o/generate_includable_module.rb, line 70
def module_name
  "::#{so_module_name}::IncludableAs%sMethod" % (
    desired_method_name \
      ? GenerateCamelizedName.call(desired_method_name)
      : GetModuleNameWithoutNamespace.call(so_module_name)
  )
end