Sha256: 46d5d4f0ea0572508cd7e019de1d7e299eca2c65bc4dda27a1ae16fa4842f412

Contents?: true

Size: 1.73 KB

Versions: 1

Compression:

Stored size: 1.73 KB

Contents

# frozen_string_literal: true

require "micro/attributes/version"
require "micro/attributes/attributes_utils"
require "micro/attributes/macros"
require "micro/attributes/features"

module Micro
  module Attributes
    def self.included(base)
      base.extend(::Micro::Attributes.const_get(:Macros))

      base.class_eval do
        private_class_method :__attributes_data, :__attributes
        private_class_method :__attributes_def, :__attributes_set
        private_class_method :__attribute_reader, :__attribute_set
      end

      def base.inherited(subclass)
        subclass.attributes(self.attributes_data({}))
        subclass.extend ::Micro::Attributes.const_get('Macros::ForSubclasses')
      end
    end

    def self.to_initialize(diff: false)
      options = [:initialize]
      options << :diff if diff
      features(*options)
    end

    def self.features(*names)
      Features.fetch(names)
    end
    singleton_class.send(:alias_method, :with, :features)

    def attributes=(arg)
      self.class.attributes_data(AttributesUtils.hash_argument!(arg)).each do |name, value|
        __attributes[name] = instance_variable_set("@#{name}", value) if attribute?(name)
      end
      __attributes.freeze
    end
    protected :attributes=

    def __attributes
      @__attributes ||= {}
    end
    private :__attributes

    def attributes
      __attributes
    end

    def attribute?(name)
      self.class.attribute?(name)
    end

    def attribute(name)
      return unless attribute?(name)

      value = public_send(name)

      block_given? ? yield(value) : value
    end

    def attribute!(name, &block)
      attribute(name) { |name| return block ? block[name] : name }

      raise NameError, "undefined attribute `#{name}"
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
u-attributes-0.10.0 lib/micro/attributes.rb