# -*- encoding: utf-8 -*-
# frozen_string_literal: true
module K
  module Replace
    class Statement
      include Keys
      include Changes

      attr_reader :source, :keys


      def initialize(source)
        @keys = []
        @source = source

        find_all(@source) do |key|
          @keys << key
        end
      end

      def replace(*objects)
        objs = hash_objects(objects)
        @source.gsub(kreplace.key_pattern) do |key|
          replaced = ''
          find_all(key) do |match|
            chained = chain_property(match)
            chained.each{|k, v| replaced = objs[k].send(v)}
          end
          replaced
        end
      end
    end
  end
end