def visible?
return true if Thread.current[:eval_access_control] == false
return true if !self.class.read_inheritable_attribute(:acts_as_filterable)
rules = self.class.read_inheritable_attribute(:visibility_perms) || []
return true if !rules.any?
visible = self.class.read_inheritable_attribute(:visibility_default) || false
rules.each do |permission, rule, opts|
Thread.current[:eval_access_control] = false
result = self.send(rule)
Thread.current[:eval_access_control] = true
if result && opts[:always]
return permission == :visible
end
if permission == :visible
visible = true if result
elsif permission == :invisible
visible = false if result
else
raise "Bad permission"
end
end
return visible
end