3 class BaseRequestNotFoundError < StandardError
4 attr_reader :base_request_hierarchy
6 def initialize(base_hierarchy)
7 @base_request_hierarchy = base_hierarchy
8 super("#{ base_request_hierarchy } could not be found!")
13 class RequestAlreadyDefinedError < StandardError
14 attr_reader :namespace,
17 def initialize(namespace, request_name)
18 @namespace = namespace
19 @request_name = request_name
20 super("#{ namespace }::#{ request_name } is already defined")
29 def define_request(root_namespace, request_name, options, &block)
30 base_klass = get_request_class(root_namespace, options[:inherit])
32 klass = Class.new(base_klass, &block)
42 namespace = namespace_arr.inject(root_namespace) do |namespace, sym|
43 const_name = sym.to_s.camelize
44 namespace.const_set(const_name, Module.new) unless namespace.const_defined?(const_name, false)
45 namespace.const_get(const_name, false)
48 klassname = request_name.to_s.camelize
50 if namespace.const_defined?(klassname, false)
51 raise RequestAlreadyDefinedError.new(namespace, klassname)
54 namespace.const_set(klassname, klass)
58 def get_request_class(root_namespace, request_class_arr)
59 provider_specific = request_class_arr != [:request]
62 full_request_class_arr = request_class_arr.dup
63 full_request_class_arr.insert(2, :requests) if provider_specific
65 full_request_class_arr = request_class_arr
68 full_request_class_arr.inject(root_namespace) do |namespace, sym|
69 namespace.const_get(sym.to_s.camelize, false)
72 if Aviator.const_defined?(full_request_class_arr[0].to_s.camelize)
73 provider = "Aviator::#{ full_request_class_arr[0] }::Provider".constantize
74 arr = ['..'] + full_request_class_arr
75 arr[-1,1] = arr.last.to_s + '.rb'
76 path = Pathname.new(provider.root_dir).join(*arr.map{|i| i.to_s }).expand_path
79 if provider && path.exist?
81 full_request_class_arr.inject(root_namespace) do |namespace, sym|
82 namespace.const_get(sym.to_s.camelize, false)
85 raise BaseRequestNotFoundError.new(request_class_arr)
96 def define_request(request_name, options={ :inherit => [:request] }, &block)
97 RequestBuilder.define_request self, request_name, options, &block