# frozen_string_literal: true module Composable module Core module InheritableAttributes extend ActiveSupport::Concern module ClassMethods def inheritable_attributes(*attributes) options = attributes.extract_options! @inheritable_attributes ||= [{attribute: :inheritable_attributes}] attributes.each do |attribute| @inheritable_attributes << {attribute: attribute, default: options[:default]} class_eval <<-RUBY, __FILE__, __LINE__ + 1 class << self; attr_accessor :#{attribute} end RUBY send("#{attribute}=", options[:default]) unless options[:default].nil? end @inheritable_attributes end def uninheritable_attributes(*attributes) options = attributes.extract_options! @uninheritable_attributes ||= [{attribute: :uninheritable_attributes}] attributes.each do |attribute| @uninheritable_attributes << {attribute: attribute, default: options[:default]} class_eval <<-RUBY, __FILE__, __LINE__ + 1 class << self; attr_accessor :#{attribute} end RUBY send("#{attribute}=", options[:default]) unless options[:default].nil? end @uninheritable_attributes end def inherited(subclass) super Array(@inheritable_attributes).each do |hash| inheritable_attribute = hash[:attribute] instance_name = "@#{inheritable_attribute}" instance_value = instance_variable_get(instance_name).deep_dup subclass.instance_variable_set(instance_name, instance_value || hash[:default].deep_dup) end Array(@uninheritable_attributes).each do |hash| uninheritable_attribute = hash[:attribute] instance_name = "@#{uninheritable_attribute}" if instance_name == "@uninheritable_attributes" instance_value = instance_variable_get(instance_name).deep_dup subclass.instance_variable_set(instance_name, instance_value) else subclass.instance_variable_set(instance_name, hash[:default].deep_dup) end end end end end end end