# File lib/paperclip/storage/s3.rb, line 85
      def self.extended base
        begin
          require 'aws-sdk'
        rescue LoadError => e
          e.message << " (You may need to install the aws-sdk gem)"
          raise e
        end unless defined?(AWS::Core)

        base.instance_eval do
          @s3_options     = @options[:s3_options]     || {}
          @s3_permissions = set_permissions(@options[:s3_permissions])
          @s3_protocol    = @options[:s3_protocol]    ||
            Proc.new do |style, attachment|
              permission  = (@s3_permissions[style.to_sym] || @s3_permissions[:default])
              permission  = permission.call(attachment, style) if permission.is_a?(Proc)
              (permission == :public_read) ? 'http' : 'https'
            end
          @s3_metadata = @options[:s3_metadata] || {}
          @s3_headers = @options[:s3_headers] || {}
          @s3_headers = @s3_headers.call(instance) if @s3_headers.is_a?(Proc)
          @s3_headers = (@s3_headers).inject({}) do |headers,(name,value)|
            case name.to_s
            when /^x-amz-meta-(.*)/i
              @s3_metadata[$1.downcase] = value
            else
              name = name.to_s.downcase.sub(/^x-amz-/,'').tr("-","_").to_sym
              headers[name] = value
            end
            headers
          end

          @s3_headers[:storage_class] = @options[:s3_storage_class] if @options[:s3_storage_class]

          @s3_server_side_encryption = @options[:s3_server_side_encryption]

          unless @options[:url].to_s.match(/^:s3.*url$/) || @options[:url] == ":asset_host"
            @options[:path] = @options[:path].gsub(/:url/, @options[:url]).gsub(/^:rails_root\/public\/system/, '')
            @options[:url]  = ":s3_path_url"
          end
          @options[:url] = @options[:url].inspect if @options[:url].is_a?(Symbol)

          @http_proxy = @options[:http_proxy] || nil
        end
        Paperclip.interpolates(:s3_alias_url) do |attachment, style|
          "#{attachment.s3_protocol(style)}://#{attachment.s3_host_alias}/#{attachment.path(style).gsub(%r{^/}, "")}"
        end unless Paperclip::Interpolations.respond_to? :s3_alias_url
        Paperclip.interpolates(:s3_path_url) do |attachment, style|
          "#{attachment.s3_protocol(style)}://#{attachment.s3_host_name}/#{attachment.bucket_name}/#{attachment.path(style).gsub(%r{^/}, "")}"
        end unless Paperclip::Interpolations.respond_to? :s3_path_url
        Paperclip.interpolates(:s3_domain_url) do |attachment, style|
          "#{attachment.s3_protocol(style)}://#{attachment.bucket_name}.#{attachment.s3_host_name}/#{attachment.path(style).gsub(%r{^/}, "")}"
        end unless Paperclip::Interpolations.respond_to? :s3_domain_url
        Paperclip.interpolates(:asset_host) do |attachment, style|
          "#{attachment.path(style).gsub(%r{^/}, "")}"
        end unless Paperclip::Interpolations.respond_to? :asset_host
      end