module Para::Cloneable
Public Instance Methods
Source
# 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
Wraps the deep_cloneable gem deep_clone method to allow using the predefined associations and options from our Cloneable.acts_as_cloneable macro.
Private Instance Methods
Source
# 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
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.