class Admission::Arbitration

Attributes

person[R]
request[R]

Public Class Methods

define_rules(privilege_order, &block) click to toggle source
# File lib/admission/arbitration.rb, line 68
def self.define_rules privilege_order, &block
  builder = self::RulesBuilder.new privilege_order
  builder.instance_exec &block
  builder.create_index
end
new(person, rules_index, request) click to toggle source
# File lib/admission/arbitration.rb, line 5
def initialize person, rules_index, request
  @person = person
  @rules_index = rules_index
  @request = request.to_sym
  @decisions = {}
end

Public Instance Methods

case_to_s() click to toggle source
# File lib/admission/arbitration.rb, line 64
def case_to_s
  @request.to_s
end
decide(privilege) click to toggle source
# File lib/admission/arbitration.rb, line 54
def decide privilege
  decision = make_decision @rules_index[@request], privilege
  return decision if decision.eql?(:forbidden) || decision.eql?(true)

  decision = decide_per_inheritance privilege
  return decision if decision.eql?(:forbidden) || decision.eql?(true)

  make_decision @rules_index[Admission::ALL_ACTION], privilege
end
decide_per_inheritance(privilege) click to toggle source
# File lib/admission/arbitration.rb, line 41
def decide_per_inheritance privilege
  inherited = privilege.inherited
  return nil if inherited.nil? || inherited.empty?

  explicit_allowance = false
  inherited.each do |p|
    rule = rule_per_privilege p
    return rule if rule == :forbidden
    explicit_allowance ||= rule
  end
  explicit_allowance
end
make_decision(from_rules, privilege) click to toggle source
# File lib/admission/arbitration.rb, line 28
def make_decision from_rules, privilege
  if from_rules
    decision = from_rules[privilege]
    decision = @person.instance_exec @context, &decision if Proc === decision

    unless Admission::VALID_DECISION.include? decision
      raise "invalid decision: #{decision}"
    end

    decision
  end
end
prepare_sitting(context=nil) click to toggle source
# File lib/admission/arbitration.rb, line 12
def prepare_sitting context=nil
  return if context == @context
  @context = context
  @decisions = {}
end
rule_per_privilege(privilege) click to toggle source
# File lib/admission/arbitration.rb, line 18
def rule_per_privilege privilege
  decision = @decisions[privilege]
  return decision unless decision.nil?

  decision = decide privilege

  decision = false if decision.nil?
  @decisions[privilege] = decision
end