class Coupdoeil::Popover

def controller = @__cp_view_context.controller

def controller = @__cp_view_context.controller

def default_options(...) = default_options_for(DEFAULT_OPTIONS_KEY, ...)

def default_options(...) = default_options_for(DEFAULT_OPTIONS_KEY, ...)

def default_options_for(*action_names, **option_values)

def default_options_for(*action_names, **option_values)
  if option_values.blank?
    @default_options_by_method[action_names.first] || default_options
  else
    action_names.each do |action_name|
      options = @default_options_by_method[action_name] || default_options
      @default_options_by_method[action_name] = options.merge(OptionsSet.new(option_values))
    end
  end
end

def helpers = @__cp_view_context

def helpers = @__cp_view_context

def inherited(subclass)

def inherited(subclass)
  super
  Coupdoeil::Popover.registry.register(subclass.popover_resource_name, subclass)
  subclass.instance_variable_set(:@default_options_by_method, @default_options_by_method.dup)
end

def initialize(params, cp_view_context)

def initialize(params, cp_view_context)
  super()
  @params = params
  @__cp_view_context = cp_view_context
end

def method_missing(method_name, *args, &)

def method_missing(method_name, *args, &)
  return super unless action_methods.include?(method_name.name)
  action_methods.each do |action_name|
    define_singleton_method(action_name) { setup_class.new(self).with_type(action_name) }
  end
  public_send(method_name)
d

def popover_resource_name = @popover_resource_name ||= name.delete_suffix("Popover").underscore

def popover_resource_name = @popover_resource_name ||= name.delete_suffix("Popover").underscore

def process(method_name, *)

def process(method_name, *)
  benchmark("processed popover #{self.class.popover_resource_name}/#{method_name}", silence: true) do
    ActiveSupport::Notifications.instrument("render_popover.coupdoeil") do
      super
      response_body || render(action_name)
    end
  end
end

def render(...)

def render(...)
  return super unless response_body
  raise DoubleRenderError, "Render was called multiple times in this action. \
 note that render does not terminate execution of the action."
end

def respond_to_missing?(method, include_all = false)

def respond_to_missing?(method, include_all = false)
  action_methods.include?(method.name) || super
end

def setup_class

def setup_class
  @setup_class ||= begin
    setup_klass = Class.new(Setup)
    action_methods.each do |action_name|
      setup_klass.define_method(action_name) { with_type(action_name) }
    end
    setup_klass
  end
end

def view_context

def view_context
  super.tap do |context|
    context.extend ViewContextDelegation
    context.popover = self
    context.__cp_view_context = @__cp_view_context
  end
end

def with(...) = setup_class.new(self).with_params(...)

def with(...) = setup_class.new(self).with_params(...)