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