5 class ApiVersionNotDefinedError < StandardError
7 super "api_version is not defined."
11 class EndpointTypeNotDefinedError < StandardError
13 super "endpoint_type is not defined."
17 class PathNotDefinedError < StandardError
19 super "path is not defined."
24 def initialize(session_data=nil)
25 @session_data = session_data
27 params = self.class.params_class.new if self.class.params_class
30 yield(params) if block_given?
31 validate_params(params)
59 self.class.optional_params
69 self.class.required_params
84 self.class.querystring?
96 def validate_params(params)
97 required_params = self.class.required_params
99 required_params.each do |name|
100 raise ArgumentError.new("Missing parameter #{ name }.") if params.send(name).nil?
105 # NOTE that, because we are defining the following as class methods, when they
106 # are called, all 'instance' variables are actually defined in the descendant class,
107 # not in the instance/object. This is by design since we want to keep these attributes
108 # within the class and because they don't change between instances anyway.
112 respond_to?(:anonymous) && anonymous == true
117 instance_methods.include? :body
122 instance_methods.include? :headers
132 @param_aliases ||= {}
137 all_params = required_params + optional_params
139 if all_params.length > 0 && @params_class.nil?
140 @params_class = build_params_class(all_params, self.param_aliases)
148 @optional_params ||= []
153 instance_methods.include? :querystring
158 @required_params ||= []
163 instance_methods.include? :url
170 def build_params_class(all_params, param_aliases)
171 Struct.new(*all_params) do
172 alias :param_getter :[]
173 alias :param_setter :[]=
175 define_method :[] do |key|
176 key = param_aliases[key.to_sym] if param_aliases.keys.include? key.to_sym
180 define_method :[]= do |key, value|
181 key = param_aliases[key.to_sym] if param_aliases.keys.include? key.to_sym
182 param_setter(key, value)
185 param_aliases.each do |param_alias, param_name|
186 define_method param_alias do
187 param_getter(param_name)
190 define_method "#{ param_alias }=" do |value|
191 param_setter(param_name, value)
199 links << { :rel => rel, :href => href }
203 def meta(attr_name, attr_value)
204 eigenclass = class << self; self; end
205 eigenclass.send(:define_method, attr_name) do
209 define_method(attr_name) do
210 self.class.send(attr_name)
215 def param(param_name, opts={})
216 opts = Hashish.new(opts)
217 list = (opts[:required] == false ? optional_params : required_params)
218 list << param_name unless optional_params.include?(param_name)
221 self.param_aliases[opts[:alias]] = param_name