lib/authority/authorizer.rb in authority-3.0.0 vs lib/authority/authorizer.rb in authority-3.1.0

- old
+ new

@@ -1,9 +1,7 @@ module Authority class Authorizer - extend Forwardable - # The base Authorizer class, from which all the authorizers in an app will # descend. Provides the authorizer with both class and instance methods # like `updatable_by?(user)`. # Exactly which methods get defined is determined from `config.abilities`; # the class is evaluated after any user-supplied config block is run @@ -18,24 +16,33 @@ # Whitelisting approach: anything not specified will be forbidden def self.default(adjective, user, options = {}) false end - # Each instance method simply calls the corresponding class method - Authority.adjectives.each do |adjective| - def_delegator :"self.class", :"#{adjective}_by?" + # the instance default method calls the class default method + def default(adjective, user, options = {}) + user_and_maybe_options = self.class.send(:user_and_maybe_options, user, options) + self.class.send(:"#{adjective}_by?", *user_and_maybe_options) end - # Each class method simply calls the `default` method + # Each method simply calls the `default` method (instance or class) Authority.adjectives.each do |adjective| class_eval <<-RUBY, __FILE__, __LINE__ + 1 def self.#{adjective}_by?(user, options = {}) - user_and_maybe_options = [user, options].tap {|args| args.pop if args.last == {}} + default(:#{adjective}, *user_and_maybe_options(user, options)) + end + + def #{adjective}_by?(user, options = {}) + user_and_maybe_options = self.class.send(:user_and_maybe_options, user, options) default(:#{adjective}, *user_and_maybe_options) end RUBY end + def self.user_and_maybe_options(user, options = {}) + [user, options].tap {|args| args.pop if args.last == {}} + end + private_class_method :user_and_maybe_options end class NoAuthorizerError < StandardError ; end end