Sha256: 06fafe8433e0711e1ef92d9f88c166957b8580bff1ff2b263a6a3c6a37440bf9
Contents?: true
Size: 1.9 KB
Versions: 1
Compression:
Stored size: 1.9 KB
Contents
require 'democritus/class_builder/command' module Democritus class ClassBuilder module Commands # Command to assign attributes as part of the initialize method. # # @example # Democritus::ClassBuilder::Commands::Attributes.new(builder: a_builder) do # attribute(:name) # attribute(:coolness_factor) # end class Attributes < ::Democritus::ClassBuilder::Command # @param builder [Democritus::ClassBuilder] # @param additional_configuration [Proc] A means to nest additional configuration def initialize(builder:, &additional_configuration) self.builder = builder self.additional_configuration = additional_configuration self.attribute_names = [] end # :reek:NestedIterators: { exclude: [ 'Democritus::ClassBuilder::Commands::Attributes#call' ] } # :reek:TooManyStatements: { exclude: [ 'Democritus::ClassBuilder::Commands::Attributes#call' ] } def call # It may seem a little odd to yield self via an instance_exec, however in some cases I need a # receiver for messages (i.e. FromJsonClassBuilder) instance_exec(self, &additional_configuration) if additional_configuration.respond_to?(:call) defer do |subject| subject.module_exec(@attribute_names) do |attribute_names| define_method(:initialize) do |**attributes| attribute_names.each do |attribute_name| send("#{attribute_name}=", attributes.fetch(attribute_name.to_sym, nil)) end end end end end def attribute(name:, **options) name = name.to_sym attribute_names << name builder.attribute(name: name, **options) end private attr_accessor :additional_configuration, :attribute_names end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
democritus-0.2.0 | lib/democritus/class_builder/commands/attributes.rb |