module Dieses::Support::ClassAttribute
Stolen and improved from dry-rb/dry-core
Public Instance Methods
define(name, default: Undefined, behave: Undefined, inherit: true, instance_reader: false)
click to toggle source
rubocop:disable Metrics/MethodLength,Layout/LineLength,Lint/RedundantCopDisableDirective
Calls superclass method
# File lib/dieses/support/class.rb, line 61 def define(name, default: Undefined, behave: Undefined, inherit: true, instance_reader: false) ivar = :"@#{name}" behave = Value.behave(behave, default) instance_variable_set(ivar, default.dup) mod = ::Module.new do define_method(name) do |new_value = Undefined| if Undefined.equal?(new_value) return instance_variable_defined?(ivar) ? instance_variable_get(ivar) : nil end instance_variable_set( ivar, behave.( instance_variable_defined?(ivar) ? instance_variable_get(ivar) : instance_variable_set(ivar, default.dup), new_value ) ) end define_method(:inherited) do |klass| klass.send(name, (inherit ? send(name) : default).dup) super(klass) end end extend(mod) define_method(name) { self.class.send(name) } if instance_reader end
defines(*names, behave: Undefined)
click to toggle source
rubocop:enable Metrics/MethodLength,Layout/LineLength,Lint/RedundantCopDisableDirective
# File lib/dieses/support/class.rb, line 95 def defines(*names, behave: Undefined) names.each { |name| define(name, behave: behave) } end