# File lib/aws/s3/s3_object.rb, line 864
      def copy_from source, options = {}

        options = options.dup

        options[:copy_source] =
          case source
          when S3Object
            "#{source.bucket.name}/#{source.key}"
          when ObjectVersion
            options[:version_id] = source.version_id
            "#{source.object.bucket.name}/#{source.object.key}"
          else
            if options[:bucket]
              "#{options.delete(:bucket).name}/#{source}"
            elsif options[:bucket_name]
              "#{options.delete(:bucket_name)}/#{source}"
            else
              "#{self.bucket.name}/#{source}"
            end
          end

        if [:metadata, :content_disposition, :content_type, :cache_control,
          ].any? {|opt| options.key?(opt) }
        then
          options[:metadata_directive] = 'REPLACE'
        else
          options[:metadata_directive] ||= 'COPY'
        end

        # copies client-side encryption materials (from the metadata or
        # instruction file)
        if options.delete(:client_side_encrypted)
          copy_cse_materials(source, options)
        end

        add_sse_options(options)

        options[:storage_class] = options.delete(:reduced_redundancy) ?
          'REDUCED_REDUNDANCY' : 'STANDARD'

        options[:bucket_name] = bucket.name
        options[:key] = key

        if use_multipart_copy?(options)
          multipart_copy(options)
        else
          resp = client.copy_object(options)
        end

        nil

      end