    # File lib/fog/vsphere/compute.rb, line 95
            def convert_vm_mob_ref_to_attr_hash(vm_mob_ref)
              return nil unless vm_mob_ref

              props = vm_mob_ref.collect!(*ATTR_TO_PROP.values.uniq)
              # NOTE: Object.tap is in 1.8.7 and later.
              # Here we create the hash object that this method returns, but first we need
              # to add a few more attributes that require additional calls to the vSphere
              # API. The hypervisor name and mac_addresses attributes may not be available
              # so we need catch any exceptions thrown during lookup and set them to nil.
              #
              # The use of the "tap" method here is a convenience, it allows us to update the
              # hash object without explicitly returning the hash at the end of the method.
              Hash[ATTR_TO_PROP.map { |k,v| [k.to_s, props[v]] }].tap do |attrs|
                attrs['id'] ||= vm_mob_ref._ref
                attrs['mo_ref'] = vm_mob_ref._ref
                # The name method "magically" appears after a VM is ready and
                # finished cloning.
                if attrs['hypervisor'].kind_of?(RbVmomi::VIM::HostSystem)
                  begin
                    host = attrs['hypervisor']
                    attrs['datacenter'] = parent_attribute(host.path, :datacenter)[1]
                    attrs['cluster']    = parent_attribute(host.path, :cluster)[1]
                    attrs['hypervisor'] = host.name
                    attrs['resource_pool'] = (vm_mob_ref.resourcePool || host.resourcePool).name rescue nil
                  rescue
                    # If it's not ready, set the hypervisor to nil
                    attrs['hypervisor'] = nil
                  end
                end
                # This inline rescue catches any standard error.  While a VM is
                # cloning, a call to the macs method will throw and NoMethodError
                attrs['mac_addresses'] = vm_mob_ref.macs rescue nil
                # Rescue nil to catch testing while vm_mob_ref isn't reaL??
                attrs['path'] = "/"+vm_mob_ref.parent.path.map(&:last).join('/') rescue nil
                attrs['relative_path'] = (attrs['path'].split('/').reject {|e| e.empty?} - ["Datacenters", attrs['datacenter'], "vm"]).join("/") rescue nil
              end
            end