class RgGen::Core::InputBase::Property

Attributes

name[R]

Public Class Methods

define(feature, name, **options, &body) click to toggle source
# File lib/rggen/core/input_base/property.rb, line 7
def self.define(feature, name, **options, &body)
  new(name, options, &body).define(feature)
end
new(name, options, &body) click to toggle source
# File lib/rggen/core/input_base/property.rb, line 11
def initialize(name, options, &body)
  @name = name
  @options = options
  @costom_property =
    if options[:body]
      create_costom_property(&options[:body])
    elsif block_given?
      create_costom_property(&body)
    end
end

Public Instance Methods

define(feature) click to toggle source
# File lib/rggen/core/input_base/property.rb, line 24
def define(feature)
  feature.class_exec(self) do |property|
    define_method(property.name) do |*args, &block|
      property.evaluate(self, args, &block)
    end
  end
end
evaluate(feature, args, &block) click to toggle source
# File lib/rggen/core/input_base/property.rb, line 32
def evaluate(feature, args, &block)
  feature.verify(@options[:verify]) if @options.key?(:verify)
  if proxy_property?
    proxy_property(feature, args, &block)
  else
    default_property(feature)
  end
end

Private Instance Methods

create_costom_property(&body) click to toggle source
# File lib/rggen/core/input_base/property.rb, line 43
def create_costom_property(&body)
  body && Module.new.module_eval do
    define_method(:__costom_property__, &body)
    instance_method(:__costom_property__)
  end
end
default_property(feature) click to toggle source
# File lib/rggen/core/input_base/property.rb, line 70
def default_property(feature)
  varible_name = "@#{@name.to_s.delete_suffix('?')}"
  if feature.instance_variable_defined?(varible_name)
    feature.instance_variable_get(varible_name)
  elsif @options.key?(:initial)
    set_initial_value(feature, varible_name)
  else
    evaluate_default_initial_value(feature, @options[:default])
  end
end
evaluate_default_initial_value(feature, value) click to toggle source
# File lib/rggen/core/input_base/property.rb, line 87
def evaluate_default_initial_value(feature, value)
  value.is_a?(Proc) ? feature.instance_exec(&value) : value
end
proxy_property(feature, args, &block) click to toggle source
# File lib/rggen/core/input_base/property.rb, line 58
def proxy_property(feature, args, &block)
  receiver, method =
    if @costom_property
      [@costom_property.bind(feature), :call]
    elsif @options[:forward_to_helper]
      [feature.class, @name]
    else
      [feature, @options[:forward_to]]
    end
  receiver.__send__(method, *args, &block)
end
proxy_property?() click to toggle source
# File lib/rggen/core/input_base/property.rb, line 50
def proxy_property?
  [
    @costom_property,
    @options[:forward_to_helper],
    @options[:forward_to]
  ].any?
end
set_initial_value(feature, varible_name) click to toggle source
# File lib/rggen/core/input_base/property.rb, line 81
def set_initial_value(feature, varible_name)
  @options[:initial]
    .yield_self { |v| evaluate_default_initial_value(feature, v) }
    .yield_self { |v| feature.instance_variable_set(varible_name, v) }
end