# File lib/sinatra/rabbit.rb, line 336
      def operation(name, opts = {}, &block)
        if @operations.keys.include?(name)
          raise DuplicateOperationException::new(500, "DuplicateOperation", "Operation #{name} is already defined", [])
        end
        # Preserve self as local variable to workaround Ruby namespace
        # weirdness
        c = self
        path_generator = Proc.new do |obj|
          if obj.member?
            if obj.standard?
              "#{parent.name}/:#{parent.name.to_s.singularize}/:#{c.name.to_s.singularize}"
            else
              "#{parent.name}/:#{parent.name.to_s.singularize}/:#{c.name.to_s.singularize}/#{name}"
            end
          else
            if obj.form?
              "#{parent.name}/:id/:#{parent.name.to_s.singularize}/#{obj.name}"
            else
              "#{parent.name}/:#{parent.name.to_s.singularize}"
            end
          end
        end
        opts.merge!({
          :path_generator => path_generator
        })
        @operations[name] = Operation.new(self, name, opts, &block)
      end