module Para::Cloneable

Public Instance Methods

deep_clone!(options = {}) click to toggle source

Wraps the deep_cloneable gem deep_clone method to allow using the predefined associations and options from our Cloneable.acts_as_cloneable macro.

# File lib/para/cloneable.rb, line 19
def deep_clone!(options = {})
  dictionary = options[:dictionary] ||= {}

  processed_options = Para::Cloneable::IncludeTreeBuilder.new(self).build
  options = options.reverse_merge(processed_options)
  callback = build_clone_callback(options.delete(:prepare))

  deep_clone(options) do |original, clone|
    Para::Cloneable::AttachmentsCloner.new(original, clone, dictionary).clone!
    callback&.call(original, clone)
  end
end

Private Instance Methods

build_clone_callback(callback) click to toggle source

We ensure that the passed callback is actually callable on the object we’re cloning. This is needed for associations because deep_cloneable calls the callback for every associated object.

# File lib/para/cloneable.rb, line 38
def build_clone_callback(callback)
  case callback
  when Proc
    callback
  when Symbol
    ->(original, clone) {
      original.send(callback, clone) if original.respond_to?(callback, true)
    }
  end
end