module Bitmarkable module Bitmarked extend ActiveSupport::Concern included do include Redis::Objects unless include?(Redis::Objects) value :bitmark cattr_accessor :url_field after_save :generate_bitmark bitmarks self.url_field || 'url' def generate_bitmark if self.class.respond_to? :delay self.class.delay.save_bitmark(self, "#{Bitmarkable.config.base_url}#{self.send(url_field.to_sym)}") else self.class.save_bitmark(self, "#{Bitmarkable.config.base_url}#{self.send(url_field.to_sym)}") end end end module ClassMethods def bitmarks(url_field = nil) self.url_field = url_field end def save_bitmark(object, url) if defined?(Rails) && !(Rails.env.development? || Rails.env.test?) object.bitmark = Bitly.shorten(url) else object.bitmark = url end end end extend ClassMethods end end