lib/popular/popular.rb in popular-0.1.0 vs lib/popular/popular.rb in popular-0.3.0

- old
+ new

@@ -1,18 +1,21 @@ module Popular module Popular - def self.included base + extend ActiveSupport::Concern - base.class_eval do + included do |base| + has_many :friendships, class_name: 'Popular::Friendship', as: :popular_model, dependent: :destroy + has_many :friends, through: :friendships, source_type: base - has_many :friendships, class_name: 'Popular::Friendship', as: :popular_model, dependent: :destroy - has_many :friends, through: :friendships, source_type: base + include ActiveSupport::Callbacks + define_callbacks :befriend + [:before_befriend, :after_befriend].each do |callback| + send callback end - end # Adds a friend to an instance's friend's list # # @param [Object] new_friend a popular_model that the instance is not already friends with @@ -22,11 +25,13 @@ # other_user = User.create name: "Jenny" # user.befriend other_user # # user.friends_with? other_user #=> true def befriend new_friend - friendships.create friend: new_friend + run_callbacks :befriend do + friendships.create friend: new_friend + end end # Adds a friend to an instance's friend's list # Similar to .befriend, but will raise an error if the operation is not successful # @@ -34,14 +39,16 @@ # # @example # user = User.create name: "Justin" # other_user = User.create name: "Jenny" # user.befriend! other_user - # user.reload + # # user.friends_with? other_user # => true def befriend! new_friend - friendships.create! friend: new_friend + run_callbacks :befriend do + friendships.create! friend: new_friend + end end # Removes a friend from an instance's friend's list # # @param [Object] friend a popular_model in this instance's friends list @@ -74,8 +81,54 @@ # user.friends_with? other_user #=> true def friends_with? popular_model friendships.where( friend: popular_model ).any? end + module ClassMethods + + # before_befriend callback convenience class method + # + # @since 0.3.0 + # + # @example + # + # class User < ActiveRecord::Base + # before_befriend :do_something_amazing + # + # def do_something_amazing + # puts name + # end + # end + # + # user = User.create name: "Justin" + # another_user = User.create name: "Jenny" + # + # user.befriend another_user #=> "Justin" + def before_befriend *args, &blk + set_callback :befriend, :before, *args, &blk + end + + # after_befriend callback convenience class method + # + # @since 0.3.0 + # + # @example + # + # class User < ActiveRecord::Base + # after_befriend :do_something_amazing + # + # def do_something_amazing + # puts name + # end + # end + # + # user = User.create name: "Justin" + # another_user = User.create name: "Jenny" + # + # user.befriend another_user #=> "Justin" + def after_befriend *args, &blk + set_callback :befriend, :after, *args, &blk + end + end end end