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