khiav223577/case_register

View on GitHub
lib/case_register.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
require 'case_register/version'

module CaseRegister
  def self.included(klass)
    type_hash = {}
    type_counter = 0

    klass.extend(
      Module.new do
        define_method(:case_register_get_method_name){|type| type_hash[type] }
        define_method(:case_register_gen_method_name) do |type|
          id = type_counter += 1
          next (type_hash[type] = :"case_register_auto_method_name#{id}")
        end

        def register_case(type, &block)
          method_name = case_register_gen_method_name(type)
          define_method(method_name, &block)
          private(method_name)
          return method_name
        end
      end
    )
  end

  def invoke_case(type, *args)
    method_name = self.class.case_register_get_method_name(type)

    fail "Undefined case `#{type}` for #{self.class}" if method_name == nil
    return send(method_name, *args)
  end

  def may_invoke_case?(type)
    self.class.case_register_get_method_name(type) != nil
  end
end