Module: PatternMatchable

Defined in:
lib/pattern_matchable.rb,
lib/pattern_matchable/version.rb

Constant Summary collapse

VERSION =
"0.2.0"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.const_missing(klass_name) ⇒ Object



42
43
44
# File 'lib/pattern_matchable.rb', line 42

def self.const_missing(klass_name)
  self.refining(Object.const_get(klass_name))
end

.refining(*klasses) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/pattern_matchable.rb', line 16

def self.refining(*klasses)
  Module.new {
    klasses.each do |klass|
      refine klass do
        def deconstruct_keys(keys)
          if defined? super
            super.then { |result|
              result.merge((keys - result.keys).to_h { [_1, public_send(_1)] })
            }
          else
            keys.to_h { [_1, public_send(_1)] }
          end
        end

        def respond_to?(name, ...)
          name == :deconstruct_keys || super
        end
      end

      define_singleton_method(:const_missing) { |nested_name|
        PatternMatchable.refining Object.const_get("#{klass.name}::#{nested_name}")
      }
    end
  }
end

Instance Method Details

#deconstruct_keys(keys) ⇒ Object



4
5
6
# File 'lib/pattern_matchable.rb', line 4

def deconstruct_keys(keys)
  keys.to_h { [_1, public_send(_1)] }
end