Class: Democritus::ClassBuilder::Commands::Attributes

Inherits:
Democritus::ClassBuilder::Command show all
Defined in:
lib/democritus/class_builder/commands/attributes.rb

Overview

Command to assign attributes as part of the initialize method.

Examples:

Democritus::ClassBuilder::Commands::Attributes.new(builder: a_builder) do
  attribute(:name)
  attribute(:coolness_factor)
end

Instance Method Summary collapse

Methods inherited from Democritus::ClassBuilder::Command

#defer

Constructor Details

#initialize(builder:, &additional_configuration) ⇒ Attributes

Returns a new instance of Attributes.

Parameters:



16
17
18
19
20
# File 'lib/democritus/class_builder/commands/attributes.rb', line 16

def initialize(builder:, &additional_configuration)
  self.builder = builder
  self.additional_configuration = additional_configuration
  self.attribute_names = []
end

Instance Method Details

#attribute(name:, **options) ⇒ Object



39
40
41
42
43
# File 'lib/democritus/class_builder/commands/attributes.rb', line 39

def attribute(name:, **options)
  name = name.to_sym
  attribute_names << name
  builder.attribute(name: name, **options)
end

#callObject

:reek:NestedIterators: { exclude: [ ‘Democritus::ClassBuilder::Commands::Attributes#call’ ] } :reek:TooManyStatements: { exclude: [ ‘Democritus::ClassBuilder::Commands::Attributes#call’ ] }



24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/democritus/class_builder/commands/attributes.rb', line 24

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