require 'cogitate/interfaces' require 'cogitate/models/identifier' module Cogitate module Models module Identifiers # Responsible for exposing class WithAttributeHash include Contracts Contract( Contracts::KeywordArgs[identifier: ::Cogitate::Interfaces::IdentifierInterface, attributes: Contracts::HashOf[String, Any]] => Contracts::Any ) def initialize(identifier:, attributes: {}) self.identifier = identifier self.attributes = attributes self.attributes.freeze end def as_json(*) { 'strategy' => strategy, 'identifying_value' => identifying_value }.merge(attributes) end extend Forwardable include Comparable def_delegators :identifier, *Cogitate::Models::Identifier.interface_method_names attr_reader :attributes private attr_accessor :identifier attr_writer :attributes def method_missing(method_name, *args, &block) attributes.fetch(method_name.to_s) { super } end def respond_to_missing?(method_name, *args) attributes.key?(method_name.to_s) || super end end end end end