Sha256: 11f3d4e6f85646f36e9215b556d0b3364cdb5a083a44b374b635cfbbcb5476ee

Contents?: true

Size: 1.44 KB

Versions: 1

Compression:

Stored size: 1.44 KB

Contents

module PolyBelongsTo
  module Dup
    extend ActiveSupport::Concern

    included do
      def self.pbt_dup_build(item_to_build_on, item_to_duplicate)
        if PolyBelongsTo::Pbt::IsReflected[item_to_build_on, item_to_duplicate]
          build_cmd = PolyBelongsTo::Pbt::BuildCmd[item_to_build_on, item_to_duplicate]
          dup_attrs = PolyBelongsTo::Pbt::AttrSanitizer[item_to_duplicate]

          build_cmd ? eval("item_to_build_on.#{build_cmd}(#{dup_attrs})") : nil
        end
      end

      def self.pbt_deep_dup_build(item_to_build_on, item_to_duplicate)
        pbt_dup_build(item_to_build_on, item_to_duplicate)
        PolyBelongsTo::Pbt::Reflects[item_to_duplicate].each do |ref|
          child = eval("item_to_duplicate.#{ref}")
          if child.respond_to?(:build)
            child.each do |obj|
              eval("item_to_build_on.#{PolyBelongsTo::Pbt::CollectionProxy[item_to_build_on, item_to_duplicate]}").
                pbt_deep_dup_build(obj)
            end
          else
            eval("item_to_build_on.#{PolyBelongsTo::Pbt::CollectionProxy[item_to_build_on, item_to_duplicate]}").
              pbt_deep_dup_build(child)
          end
        end
        item_to_build_on       
      end

   end

    def pbt_dup_build(item_to_duplicate)
      self.class.pbt_dup_build(self, item_to_duplicate)
    end

    def pbt_deep_dup_build(item_to_duplicate)
      self.class.pbt_deep_dup_build(self, item_to_duplicate)
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
poly_belongs_to-0.1.4 lib/poly_belongs_to/dup.rb