Sha256: 08a61d84290a3c5fcd85edb8036dd21d0eceec6da3c95533b91c53093b2becde

Contents?: true

Size: 1.77 KB

Versions: 1

Compression:

Stored size: 1.77 KB

Contents

module Consul
  module Controller

    def self.included(base)
      base.send :include, InstanceMethods
      base.send :extend, ClassMethods
    end

    module ClassMethods

      private

      def require_power_check(options = {})
        before_filter :unchecked_power, options
      end

      def skip_power_check(options = {})
        skip_before_filter :unchecked_power, options
      end

      def power(*args)

        args_copy = args.dup
        options = args_copy.extract_options!
        default_power = args_copy.shift # might be nil

        filter_options = options.slice(:except, :only)
        skip_power_check filter_options

        power_method = options[:power] || :current_power
        actions_map = (options[:map] || {})

        direct_access_method = options[:as]

        # Store arguments for testing
        @consul_power_args = args

        before_filter :check_power, filter_options

        private

        define_method :check_power do
          send(power_method).include!(power_for_action)
        end

        define_method direct_access_method do
          send(power_method).send(power_for_action)
        end if direct_access_method

        define_method :power_for_action do
          key = actions_map.keys.detect do |actions|
            Array(actions).collect(&:to_s).include?(action_name)
          end
          if key
            actions_map[key]
          elsif default_power
            default_power
          else
            raise Consul::UnmappedAction, "Could not map the action ##{action_name} to a power"
          end
        end

      end

    end

    module InstanceMethods

      private

      def unchecked_permissions
        raise Consul::UncheckedPower, "This controller does not check against a power"
      end

    end

  end
  
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
consul-0.1.0 lib/consul/controller.rb