module MadCart::Store::Base::ClassMethods

Public Instance Methods

after_initialize(*args) click to toggle source
# File lib/mad_cart/store/base.rb, line 169
def after_initialize(*args)
  @after_init_delegate = parse_delegate(args.first, :after_initialize)
end
create_connection_with(*args) click to toggle source
# File lib/mad_cart/store/base.rb, line 147
def create_connection_with(*args)
  @connection_delegate = parse_delegate(args.first, :create_connection_with)
  opts = args[1] || {}
  @required_connection_args = opts[:requires] || []
end
fetch(model, options={}) click to toggle source
# File lib/mad_cart/store/base.rb, line 153
def fetch(model, options={})
  @fetch_delegates ||= {}
  @format_delegates ||= {}
  @fetch_delegates[model] = parse_delegate(options, :fetch)

  define_method_for(model)
end
format(model, options={}) click to toggle source
# File lib/mad_cart/store/base.rb, line 161
def format(model, options={})
  if @fetch_delegates[model].nil?
    raise ArgumentError, "Cannot define 'format' for a model that has not defined 'fetch'"
  end

  @format_delegates[model] = parse_delegate(options, :format)
end

Private Instance Methods

define_method_for(model) click to toggle source
# File lib/mad_cart/store/base.rb, line 182
def define_method_for(model)
  define_method model do |*args|
    fetch_result = execute_delegate(self.class.fetch_delegates[model], *args)
    formatted_result = if self.class.format_delegates[model]
                         formatter = self.class.format_delegates[model]
                         fetch_result.map{|r| execute_delegate(formatter, r)}
                       else
                         fetch_result
                       end

    return ensure_model_format(model, formatted_result)
  end
end
parse_delegate(arg, method) click to toggle source
# File lib/mad_cart/store/base.rb, line 173
def parse_delegate(arg, method)
  return arg if (arg.is_a?(Symbol) || arg.is_a?(Proc))
  return arg[:with] if arg.is_a?(Hash) && arg[:with]

  raise ArgumentError, "Invalid delegate for #{method}: "\
    "#{arg.first.class}. Use Proc or Symbol. "
end