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