module AuthStrategist class Authorize attr_reader :strategy def self.call(options = {}) new(options).call end def initialize(options = {}) @strategy = choose_strategy(options) end def call strategy.authorize! end private def choose_strategy(options = {}) strategy_name = options.delete(:strategy) raise(strategy_name_blank) if strategy_name.nil? strategy_class = strategies[strategy_name] raise(strategy_not_found(strategy_name)) if strategy_class.nil? strategy_class.new(options) end def strategies AuthStrategist.strategies.to_h end def strategy_not_found(strategy_name) StandardError.new("Strategy :#{strategy_name} was not found.") end def strategy_name_blank StandardError.new(':strategy option must not be blank.') end end end