Sha256: fbbd7f04cfe9fa8db7877868af9bcfb2bc95c76a679ca6f584c245f4de21bf4e

Contents?: true

Size: 1.85 KB

Versions: 1

Compression:

Stored size: 1.85 KB

Contents

# frozen_string_literal: true

module Xip
  class Controller
    module Callbacks

      extend ActiveSupport::Concern

      include ActiveSupport::Callbacks

      included do
        define_callbacks :action, skip_after_callbacks_if_terminated: true
      end

      class_methods do
        def _normalize_callback_options(options)
          _normalize_callback_option(options, :only, :if)
          _normalize_callback_option(options, :except, :unless)
        end

        def _normalize_callback_option(options, from, to)
          if from = options[from]
            _from = Array(from).map(&:to_s).to_set
            from = proc { |c| _from.include?(c.action_name) }
            options[to] = Array(options[to]).unshift(from)
          end
        end

        def _insert_callbacks(callbacks, block = nil)
          options = callbacks.extract_options!
          _normalize_callback_options(options)
          callbacks.push(block) if block
          callbacks.each do |callback|
            yield callback, options
          end
        end

        [:before, :after, :around].each do |callback|
          define_method "#{callback}_action" do |*names, &blk|
            _insert_callbacks(names, blk) do |name, options|
              set_callback(:action, callback, name, options)
            end
          end

          define_method "prepend_#{callback}_action" do |*names, &blk|
            _insert_callbacks(names, blk) do |name, options|
              set_callback(:action, callback, name, options.merge(prepend: true))
            end
          end

          define_method "skip_#{callback}_action" do |*names|
            _insert_callbacks(names) do |name, options|
              skip_callback(:action, callback, name, options)
            end
          end

          alias_method :"append_#{callback}_action", :"#{callback}_action"
        end
      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
xip-2.0.0.beta2 lib/xip/controller/callbacks.rb