module Protobuf::Rpc::ServiceFilters::ClassMethods

def define_filter(type, filter, options = {})

def define_filter(type, filter, options = {})
  return if filter_defined?(type, filter)
  filters[type] << options.merge({ :callable => filter })
  remember_filter(type, filter)
end

def defined_filters

def defined_filters
  @defined_filters ||= Hash.new { |h,k| h[k] = Set.new }
end

def filter_defined?(type, filter)


Check to see if the filter has been defined.
def filter_defined?(type, filter)
  defined_filters[type].include?(filter)
end

def filters


whose values are Sets.
Filters hash keyed based on filter type (e.g. :before, :after, :around),
def filters
  @filters ||= Hash.new { |h,k| h[k] = [] }
end

def remember_filter(type, filter)


Remember that we stored the filter.
def remember_filter(type, filter)
  defined_filters[type] << filter
end

def rescue_filters


whose values are Sets.
Filters hash keyed based on filter type (e.g. :before, :after, :around),
def rescue_filters
  @rescue_filters ||= {}
end

def rescue_from(*ex_klasses, &block)

def rescue_from(*ex_klasses, &block)
  options = ex_klasses.last.is_a?(Hash) ? ex_klasses.pop : {}
  callable = options.delete(:with) { block }
  raise ArgumentError, 'Option :with missing from rescue_from options' if callable.nil?
  ex_klasses.each { |ex_klass| rescue_filters[ex_klass] = callable }
end

def set_filters(type, *args)


TODO add support for only/except sub-filters
TODO add support for if/unless
Takes a list of actually (or potentially) callable objects.
def set_filters(type, *args)
  options = args.last.is_a?(Hash) ? args.pop : {}
  args.each do |filter|
    define_filter(type, filter, options)
  end
end