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