class Admission::Status

Attributes

debug[RW]
person[R]
privileges[R]
rules[R]

Public Class Methods

new(person, privileges, rules, arbiter) click to toggle source
# File lib/admission/status.rb, line 6
def initialize person, privileges, rules, arbiter
  @person = person
  @rules = rules
  @arbiter = arbiter

  @privileges = if privileges.nil? || privileges.empty?
    nil

  else
    # sort privileges
    # convenient as for arbitration doesn't have to switch between contexts too often
    grouped = privileges.inject Hash.new do |h, p|
      hash = p.context.hash rescue nil.hash
      (h[hash] ||= []) << p
      h
    end

    grouped.values.flatten.freeze
  end
end

Public Instance Methods

allowed_in_contexts(*args) click to toggle source
# File lib/admission/status.rb, line 55
def allowed_in_contexts *args
  return [] unless privileges
  arbitration = instantiate_arbitration *args

  privileges.reduce [] do |list, privilege|
    context = privilege.context

    unless list.include? context
      arbitration.prepare_sitting context
      list << context if arbitration.rule_per_privilege(privilege).eql? true
    end

    list
  end
end
can?(*args) click to toggle source
# File lib/admission/status.rb, line 27
def can? *args
  return false unless privileges
  process_request instantiate_arbitration(*args)
end
cannot?(*args) click to toggle source
# File lib/admission/status.rb, line 32
def cannot? *args
  !can?(*args)
end
has?(sought) click to toggle source
# File lib/admission/status.rb, line 44
def has? sought
  return false unless privileges

  list = sought.context ? privileges.select{|p| p.context == sought.context} : privileges
  list.any?{|p| p.eql_or_inherits? sought}
end
instantiate_arbitration(*args) click to toggle source
# File lib/admission/status.rb, line 51
def instantiate_arbitration *args
  @arbiter.new person, rules, *args
end
request!(*args) { |exception| ... } click to toggle source
# File lib/admission/status.rb, line 36
def request! *args
  can?(*args) || begin
    exception = Admission::Denied.new self, *args
    yield exception if block_given?
    raise exception
  end
end

Private Instance Methods

process_request(arbitration) click to toggle source
# File lib/admission/status.rb, line 73
def process_request arbitration
  ::Admission.debug_arbitration.call arbitration if ::Admission.debug_arbitration

  privileges.any? do |privilege|
    arbitration.prepare_sitting privilege.context
    arbitration.rule_per_privilege(privilege).eql? true
  end
end