module Massager::ClassMethods

Public Instance Methods

_container() click to toggle source
# File lib/massager.rb, line 55
def _container
  @container ||= Dry::Container.new
end
attribute(name, *target_keys, **opts, &block) click to toggle source
# File lib/massager.rb, line 29
def attribute(name, *target_keys, **opts, &block)
  case
  when target_keys.count > 1
    register_attribute(
      AttributeWithMultipleKeys.new(name: name, keys: target_keys, opts: opts, block: block)
    )
  when target_keys.count == 1
    register_attribute(
      AttributeWithSingleKey.new(name: name, key: target_keys.first, opts: opts, block: block)
    )
  end
  add_keys_to_schema(opts, target_keys)
  define_setter(name)
  define_getter(name)
end
call(attrs) click to toggle source
# File lib/massager.rb, line 45
def call(attrs)
  check_schema(attrs)
  instance = new
  _container.keys.select {|a| a.include?("attributes.")}.each do |k|
    attribute = _container.resolve(k)
    instance.public_send("#{attribute.name}=", attrs) if attribute.match_schema?(attrs)
  end
  instance
end

Private Instance Methods

add_keys_to_schema(opts, target_keys) click to toggle source
# File lib/massager.rb, line 70
def add_keys_to_schema(opts, target_keys)
  Dry::Monads::Maybe(opts[:strict]).fmap {
    unless _container.key?(:schema)
      _container.register(:schema, Set.new)
    end
    target_keys.each do |k|
      _container.resolve(:schema) << k
    end
  }
end
check_schema(attrs) click to toggle source
# File lib/massager.rb, line 61
def check_schema(attrs)
  attr_keys = attrs.keys.to_set
  if _container.key?("schema")
    schema = _container.resolve("schema")
    attr_keys = attr_keys.find_all {|a| schema.include?(a)}
    raise ArgumentError, "Missing keys: #{(schema - attr_keys).to_a}" unless schema.subset?(attr_keys.to_set)
  end
end
define_getter(name) click to toggle source
# File lib/massager.rb, line 94
def define_getter(name)
  define_method name, Proc.new {
    instance_variable_get(:"@#{name}")
  }
end
define_setter(name) click to toggle source
# File lib/massager.rb, line 87
def define_setter(name)
  define_method "#{name}=", Proc.new {|values|
    attribute = self.class._container.resolve("attributes.#{name}")
    instance_variable_set(:"@#{name}", attribute.call(values))
  }
end
inherited(subclass) click to toggle source
# File lib/massager.rb, line 100
def inherited(subclass)
  subclass_container = Dry::Container.new
  _container.keys.each do |k|
    subclass_container.register(k, _container.resolve(k).clone)
  end
  subclass.instance_variable_set(:"@container", subclass_container)
end
register_attribute(attribute) click to toggle source
# File lib/massager.rb, line 81
def register_attribute(attribute)
  _container.namespace(:attributes) do
    register(attribute.name, attribute)
  end
end