Module: Pcli::Depends

Defined in:
lib/pcli/depends.rb

Class Method Summary collapse

Class Method Details

.on(*names, **kw_names) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
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
41
# File 'lib/pcli/depends.rb', line 5

def self.on(*names, **kw_names)
  Module.new do
    class_methods = Module.new do
      define_method :dependencies do
        names + kw_names.values
      end
    end

    define_singleton_method :included do |base|
      base.extend class_methods
    end

    names.each do |name|
      method_name = name.split('.').last

      define_method(method_name) { @_dependencies[name] }
    end

    kw_names.each do |method_name, name|
      define_method(method_name) { @_dependencies[name] }
    end

    define_method :initialize do |**args|
      @_dependencies = self.class.dependencies.map { |n| [n, nil] }.to_h

      args.each do |key, value|
        key = key.to_s
        raise "#{self.class.name} given invalid dependency \"#{key}\"" unless @_dependencies.key?(key)

        @_dependencies[key] = value
      end
      @_dependencies.each_key do |n|
        raise "#{self.class.name} missing dependency \"#{n}\"" unless args.key?(n.to_sym)
      end
    end
  end
end