Sha256: 6a2bf5c830d75db16dd948c7826d83f602f1c777a30f29e677c4cf26b1c463f4

Contents?: true

Size: 1.32 KB

Versions: 1

Compression:

Stored size: 1.32 KB

Contents

require 'dry/core/constants'

module Dry
  module Core
    # Internal support module for class-level settings
    #
    # @api public
    module ClassAttributes
      include Constants

      # Specify what attirubtes a class will use
      #
      # @example
      #   class MyClass
      #     extend Dry::Core::ClassAttributes
      #
      #     defines :one, :two
      #
      #     one 1
      #     two 2
      #   end
      #
      #   class OtherClass < MyClass
      #     two 'two'
      #   end
      #
      #   MyClass.one # => 1
      #   MyClass.two # => 2
      #
      #   OtherClass.one # => 1
      #   OtherClass.two # => 'two'
      def defines(*args)
        mod = Module.new do
          args.each do |name|
            define_method(name) do |value = Undefined|
              ivar = "@#{name}"

              if value == Undefined
                if instance_variable_defined?(ivar)
                  instance_variable_get(ivar)
                else
                  nil
                end
              else
                instance_variable_set(ivar, value)
              end
            end
          end

          define_method(:inherited) do |klass|
            args.each { |name| klass.public_send(name, send(name)) }

            super(klass)
          end
        end

        extend(mod)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dry-core-0.3.0 lib/dry/core/class_attributes.rb