Method: ZergXcode::XcodeObject.from

Defined in:
lib/zerg_xcode/objects/xcode_object.rb

.from(object_or_hash) ⇒ Object

Deep copy



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/zerg_xcode/objects/xcode_object.rb', line 159

def self.from(object_or_hash)
  new_object = case object_or_hash
  when ZergXcode::XcodeObject
    object_or_hash.shallow_copy
  else
    self.new object_or_hash.dup
  end
  object_map = { object_or_hash => new_object }
  
  new_object.visit do |object, parent, key, value|
    case value
    when Hash, Array
      next value.dup
    when ZergXcode::XcodeObject
      if object_map[value]
        parent[key] = object_map[value]
        next false
      else
        object_map[value] = value.shallow_copy
        next object_map[value]
      end
    else
      next true
    end
  end
end