Module: TypeWrapper

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

Constant Summary collapse

FOR =
-> type, *behaviors do
  Class.new(Delegator) do
    include TypeWrapper
    const_set :Type, type
    const_set :BEHAVIORS, behaviors
    const_set :Trait, Module.new { refine(type) { prepend(*behaviors.reverse) } }
    forwarding = behaviors.flat_map(&:public_instance_methods) - public_instance_methods
    code = forwarding.uniq.map { |meth| "def %{meth}(*args, &block) __getobj__.%{meth}(*args, &block) end" % { meth: meth } }
    class_eval code.unshift("using Trait").join("\n")
  end
end
VERSION =
"1.1.0"

Class Method Summary collapse

Class Method Details

.[](type, *modules) ⇒ Object

Raises:

  • (TypeError)


13
14
15
16
17
18
19
# File 'lib/type_wrapper.rb', line 13

def self.[](type, *modules)
  raise TypeError, "wrong argument type (expected Class)" unless Class === type
  raise TypeError, "wrong argument type (expected Module(s))" unless modules.all? { |mod| mod.class == Module }
  raise ArgumentError, "wrong number of arguments (given 1, expected 2+)" if modules.empty?

  FOR[type, *modules]
end