This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class Pry
|
||||
class Config
|
||||
# Attributable provides the ability to create "attribute"
|
||||
# accessors. Attribute accessors create a standard "attr_writer" and a
|
||||
# customised "attr_reader". This reader is Proc-aware (lazy).
|
||||
#
|
||||
# @since v0.13.0
|
||||
# @api private
|
||||
module Attributable
|
||||
def attribute(attr_name)
|
||||
define_method(attr_name) do
|
||||
value = Config::Value.new(instance_variable_get("@#{attr_name}"))
|
||||
value.call
|
||||
end
|
||||
|
||||
attr_writer(attr_name)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,29 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class Pry
|
||||
class Config
|
||||
# LazyValue is a Proc (block) wrapper. It is meant to be used as a
|
||||
# configuration value. Subsequent `#call` calls always evaluate the given
|
||||
# block.
|
||||
#
|
||||
# @example
|
||||
# num = 19
|
||||
# value = Pry::Config::LazyValue.new { num += 1 }
|
||||
# value.foo # => 20
|
||||
# value.foo # => 21
|
||||
# value.foo # => 22
|
||||
#
|
||||
# @api private
|
||||
# @since v0.13.0
|
||||
# @see Pry::Config::MemoizedValue
|
||||
class LazyValue
|
||||
def initialize(&block)
|
||||
@block = block
|
||||
end
|
||||
|
||||
def call
|
||||
@block.call
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,34 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class Pry
|
||||
class Config
|
||||
# MemoizedValue is a Proc (block) wrapper. It is meant to be used as a
|
||||
# configuration value. Subsequent `#call` calls return the same memoized
|
||||
# result.
|
||||
#
|
||||
# @example
|
||||
# num = 19
|
||||
# value = Pry::Config::MemoizedValue.new { num += 1 }
|
||||
# value.call # => 20
|
||||
# value.call # => 20
|
||||
# value.call # => 20
|
||||
#
|
||||
# @api private
|
||||
# @since v0.13.0
|
||||
# @see Pry::Config::LazyValue
|
||||
class MemoizedValue
|
||||
def initialize(&block)
|
||||
@block = block
|
||||
@called = false
|
||||
@call = nil
|
||||
end
|
||||
|
||||
def call
|
||||
return @call if @called
|
||||
|
||||
@called = true
|
||||
@call = @block.call
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,24 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class Pry
|
||||
class Config
|
||||
# Value holds a value for the given attribute and decides how it should
|
||||
# be read. Procs get called, other values are returned as is.
|
||||
#
|
||||
# @since v0.13.0
|
||||
# @api private
|
||||
class Value
|
||||
def initialize(value)
|
||||
@value = value
|
||||
end
|
||||
|
||||
def call
|
||||
unless [Config::MemoizedValue, Config::LazyValue].include?(@value.class)
|
||||
return @value
|
||||
end
|
||||
|
||||
@value.call
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user