# File lib/new_relic/agent/instrumentation/data_mapper.rb, line 116
      def self.method_body(clazz, method_name, operation_only)
        use_model_name   = NewRelic::Helper.instance_methods_include?(clazz, :model)
        metric_operation = method_name.to_s.gsub(/[!?]/, "")

        Proc.new do |*args, &blk|
          begin
            if operation_only
              # Used by direct SQL, like ::DataMapper::Adapters::DataObjectsAdapter#select
              name = nil
            elsif use_model_name
              # Used by ::DataMapper::Collection to get contained model name
              name = self.model.name
            elsif self.is_a?(Class)
              # Used by class-style access, like Model.first()
              name = self.name
            else
              # Used by instance-style access, like model.update(attr: "new")
              name = self.class.name
            end

            segment = NewRelic::Agent::Transaction.start_datastore_segment DATA_MAPPER, metric_operation, name

            begin
              self.send("#{method_name}_without_newrelic", *args, &blk)
            rescue ::DataObjects::ConnectionError => e
              raise
            rescue ::DataObjects::SQLError => e
              e.uri.gsub!(PASSWORD_REGEX, AMPERSAND) if e.uri.include?(PASSWORD_PARAM)

              strategy = NewRelic::Agent::Database.record_sql_method(:slow_sql)
              case strategy
              when :obfuscated
                adapter_name = if self.respond_to?(:options)
                    self.options[:adapter]
                  else
                    if self.repository.adapter.respond_to?(:options)
                      self.repository.adapter.options[:adapter]
                    else
                      # DataMapper < 0.10.0
                      self.repository.adapter.uri.scheme
                    end
                  end
                statement = NewRelic::Agent::Database::Statement.new(e.query, :adapter => adapter_name)
                obfuscated_sql = NewRelic::Agent::Database.obfuscate_sql(statement)
                e.instance_variable_set(:@query, obfuscated_sql)
              when :off
                e.instance_variable_set(:@query, nil)
              end

              raise
            ensure
              segment.finish
            end
          end
        end
      end