class Dynamican::Evaluator

Attributes

action[R]
conditions_instances[R]
item[R]
item_name[R]
subject[R]

Public Class Methods

new(subject, action, item, conditions_instances = {}) click to toggle source
# File lib/dynamican/evaluator.rb, line 5
def initialize(subject, action, item, conditions_instances = {})
  @subject = subject
  @action = action
  @item = item
  @item_name = calculate_item_name
  @conditions_instances = conditions_instances
end

Public Instance Methods

evaluate() click to toggle source
# File lib/dynamican/evaluator.rb, line 13
def evaluate
  set_instance_variables

  matching_permissions = item.present? ? subject.permissions.for_action(action).for_item(item_name) : subject.permissions.for_action(action).without_item
  matching_permissions_statements = matching_permissions.conditional.map(&:conditions).flatten.map(&:statement)

  matching_permissions.unconditional.any? ||
  matching_permissions_statements.any? && matching_permissions_statements.map { |statement| eval statement }.all?
end

Private Instance Methods

calculate_item_name() click to toggle source
# File lib/dynamican/evaluator.rb, line 34
def calculate_item_name
  class_name = if item.class.in? [Symbol, String, Class]
    item.to_s.classify
  else
    item.class.name.demodulize
  end

  given_item_name = item.class.try(:dynamican_item_name)

  given_item_name || class_name
end
set_instance_variables() click to toggle source
# File lib/dynamican/evaluator.rb, line 25
def set_instance_variables
  instance_variable_set("@#{subject.class.name.demodulize.underscore}", subject)
  instance_variable_set("@#{item.class.name.demodulize.underscore}", item)

  conditions_instances.each do |instance_name, instance_item|
    instance_variable_set("@#{instance_name}", instance_item)
  end
end