class Dry::Initializer::Builders::Reader

@private

def self.[](definition)

def self.[](definition)
  new(definition).call
end

def attribute_line

def attribute_line
  return unless @reader
  "attr_reader :#{@target}" unless @null
end

def call

def call
  lines.flatten.compact.join("\n")
end

def initialize(definition)

def initialize(definition)
  @target = definition.target
  @ivar   = definition.ivar
  @null   = definition.null
  @reader = definition.reader
end

def lines

def lines
  [undef_line, attribute_line, method_lines, type_line]
end

def method_lines

def method_lines
  return unless @reader
  return unless @null
  [
    "def #{@target}",
    "  #{@ivar} unless Dry::Initializer::UNDEFINED == #{@ivar}",
    "end"
  ]
end

def type_line

def type_line
  "#{@reader} :#{@target}" if %i[private protected].include? @reader
end

def undef_line

def undef_line
  "undef :#{@target} if method_defined?(:#{@target})" \
    "  || private_method_defined?(:#{@target})" \
    "  || protected_method_defined?(:#{@target})"
end