restly 0.0.1.alpha.1 → 0.0.1.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. data/.rspec +2 -0
  2. data/README.md +63 -3
  3. data/lib/generators/restly_config_generator.rb +13 -0
  4. data/lib/generators/restly_model_generator.rb +18 -0
  5. data/lib/generators/templates/config.yml.erb +32 -0
  6. data/lib/generators/templates/model.rb.erb +9 -0
  7. data/lib/restly/associations/base.rb +83 -12
  8. data/lib/restly/associations/belongs_to.rb +23 -6
  9. data/lib/restly/associations/embeddable_resources/embeds_many.rb +4 -0
  10. data/lib/restly/associations/embeddable_resources/embeds_one.rb +4 -0
  11. data/lib/restly/associations/embeddable_resources.rb +15 -4
  12. data/lib/restly/associations/has_many.rb +0 -9
  13. data/lib/restly/associations/has_one.rb +0 -9
  14. data/lib/restly/associations.rb +75 -15
  15. data/lib/restly/base/generic_methods.rb +10 -2
  16. data/lib/restly/base/includes.rb +0 -22
  17. data/lib/restly/base/instance/attributes.rb +26 -16
  18. data/lib/restly/base/instance/persistence.rb +6 -1
  19. data/lib/restly/base/{write_callbacks.rb → instance/write_callbacks.rb} +1 -1
  20. data/lib/restly/base/instance.rb +15 -9
  21. data/lib/restly/base.rb +3 -4
  22. data/lib/restly/client.rb +2 -2
  23. data/lib/restly/collection/pagination.rb +1 -1
  24. data/lib/restly/concerned_inheritance.rb +30 -0
  25. data/lib/restly/configuration.rb +20 -18
  26. data/lib/restly/error.rb +18 -20
  27. data/lib/restly/nested_attributes.rb +4 -3
  28. data/lib/restly/proxies/{auth.rb → authorization.rb} +1 -1
  29. data/lib/restly/proxies/base.rb +4 -0
  30. data/lib/restly/proxies/{params.rb → with_params.rb} +1 -1
  31. data/lib/restly/proxies/with_path.rb +24 -0
  32. data/lib/restly/proxies.rb +3 -4
  33. data/lib/restly/railtie.rb +5 -0
  34. data/lib/restly/version.rb +1 -1
  35. data/lib/restly.rb +2 -0
  36. data/restly.gemspec +0 -1
  37. data/spec/restly/associations/base_spec.rb +8 -0
  38. data/spec/restly/associations/belongs_to_spec.rb +8 -0
  39. data/spec/restly/associations/embeddable_resources/embeds_many_spec.rb +8 -0
  40. data/spec/restly/associations/embeddable_resources/embeds_one_spec.rb +8 -0
  41. data/spec/restly/associations/embeddable_resources_spec.rb +8 -0
  42. data/spec/restly/associations/has_many_spec.rb +8 -0
  43. data/spec/restly/associations/has_one_spec.rb +8 -0
  44. data/spec/restly/associations_spec.rb +8 -0
  45. data/spec/restly/base/fields_spec.rb +8 -0
  46. data/spec/restly/base/generic_methods_spec.rb +8 -0
  47. data/spec/restly/base/includes_spec.rb +8 -0
  48. data/spec/restly/base/instance/actions_spec.rb +8 -0
  49. data/spec/restly/base/instance/attributes_spec.rb +8 -0
  50. data/spec/restly/base/instance/persistence_spec.rb +8 -0
  51. data/spec/restly/base/instance/write_callbacks_spec.rb +8 -0
  52. data/spec/restly/base/instance_spec.rb +8 -0
  53. data/spec/restly/base/mass_assignment_security_spec.rb +8 -0
  54. data/spec/restly/base/resource/finders_spec.rb +8 -0
  55. data/spec/restly/base/resource_spec.rb +8 -0
  56. data/spec/restly/base_spec.rb +5 -51
  57. data/spec/restly/client_spec.rb +8 -0
  58. data/spec/restly/collection/pagination_spec.rb +8 -0
  59. data/spec/restly/collection_spec.rb +8 -0
  60. data/spec/restly/concearned_inheritance_spec.rb +8 -0
  61. data/spec/restly/configuration_spec.rb +8 -0
  62. data/spec/restly/connection_spec.rb +8 -0
  63. data/spec/restly/controller_methods_spec.rb +8 -0
  64. data/spec/restly/middleware_spec.rb +8 -0
  65. data/spec/restly/nested_attributes_spec.rb +8 -0
  66. data/spec/restly/proxies/associations/collection_spec.rb +8 -0
  67. data/spec/restly/proxies/associations/instance_spec.rb +8 -0
  68. data/spec/restly/proxies/authorization_spec.rb +8 -0
  69. data/spec/restly/proxies/base_spec.rb +8 -0
  70. data/spec/restly/proxies/with_params_spec.rb +8 -0
  71. data/spec/restly/thread_local_spec.rb +8 -0
  72. data/spec/{helper.rb → spec_helper.rb} +0 -3
  73. metadata +82 -26
  74. data/lib/restly/associations/builder.rb +0 -30
  75. data/spec/fakewebs.rb +0 -0
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Restly
2
2
 
3
- TODO: Write a gem description
3
+ Restly is an ActiveModel based ODM (Object Document Mapper) for restful web-services. It includes the ability to define relationships to any Ruby class using some built in helpers.
4
4
 
5
5
  ## Installation
6
6
 
@@ -16,9 +16,69 @@ Or install it yourself as:
16
16
 
17
17
  $ gem install restly
18
18
 
19
- ## Usage
19
+ ## Configuration
20
+ In order for restly to funciton it will need some configuration. This can be done by placing restly.yml in your config directory. We have added a generator to make this easier.
20
21
 
21
- TODO: Write usage instructions here
22
+ ```sh
23
+ $ rails generate restly:configuration
24
+ ```
25
+
26
+ This will generate a file like so:
27
+
28
+ ```yaml
29
+ development: &development
30
+ site: http://example.com # Change This
31
+ default_format: json # defaults to: json
32
+
33
+ ## Would you like requests to be cached?
34
+ # cache: true
35
+ # cache_options:
36
+ # expires_in: 3600
37
+
38
+ ## Enable Oauth?
39
+ # use_oauth: true
40
+ # oauth_options:
41
+ # client_id: %client_id%
42
+ # client_secret: %client_secret%
43
+
44
+ test:
45
+ <<: *development
46
+
47
+ production:
48
+ site: http://example.com # Change This
49
+ default_format: json # defaults to: json
50
+
51
+ # Would you like requests to be cached?
52
+ cache: true
53
+ cache_options:
54
+ expires_in: 3600
55
+
56
+ ## Enable Oauth?
57
+ # use_oauth: true
58
+ # oauth_options:
59
+ # client_id: %client_id%
60
+ # client_secret: %client_secret%
61
+
62
+ ```
63
+
64
+ ## Creating a Restly Model
65
+
66
+ # Using the generator
67
+
68
+ ```
69
+ $ rails generate restly:model MyModel
70
+ ```
71
+
72
+ This will generate a model that looks like this:
73
+
74
+ ```ruby
75
+ class MyModel < Restly::Base
76
+
77
+ # self.resource_name = 'my_model'
78
+ # self.path = 'some_path/to_resource' # defaults to: 'resource_name.pluralized'
79
+
80
+ end
81
+ ```
22
82
 
23
83
  ## Contributing
24
84
 
@@ -0,0 +1,13 @@
1
+ module Restly
2
+ module Generators
3
+ class ConfigGenerator < Rails::Generators::Base
4
+
5
+ source_root File.expand_path("../templates", __FILE__)
6
+
7
+ def create_config_file
8
+ template "config.yml.erb", "config/restly.yml"
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ module Restly
2
+ module Generators
3
+ class ModelGenerator < Rails::Generators::NamedBase
4
+
5
+ source_root File.expand_path("../templates", __FILE__)
6
+
7
+ def initialize(args, *options) #:nodoc:
8
+ args[0] = args[0].gsub(/\./,'_')
9
+ super
10
+ end
11
+
12
+ def create_model_file
13
+ template "model.rb.erb", "app/models/#{file_name}.rb"
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,32 @@
1
+ development: &development
2
+ site: http://example.com # Change This
3
+ default_format: json # defaults to: json
4
+
5
+ ## Would you like requests to be cached?
6
+ # cache: true
7
+ # cache_options:
8
+ # expires_in: 3600
9
+
10
+ ## Enable Oauth?
11
+ # use_oauth: true
12
+ # oauth_options:
13
+ # client_id: %client_id%
14
+ # client_secret: %client_secret%
15
+
16
+ test:
17
+ <<: *development
18
+
19
+ production:
20
+ site: http://example.com # Change This
21
+ default_format: json # defaults to: json
22
+
23
+ # Would you like requests to be cached?
24
+ cache: true
25
+ cache_options:
26
+ expires_in: 3600
27
+
28
+ ## Enable Oauth?
29
+ # use_oauth: true
30
+ # oauth_options:
31
+ # client_id: %client_id%
32
+ # client_secret: %client_secret%
@@ -0,0 +1,9 @@
1
+ class <%= class_name %> < Restly::Base
2
+
3
+ ## Override the Site
4
+ # self.site = "anotherexample.com" # defaults to config's site
5
+ # self.resource_name = "some_other_name" # defaults to class_name.underscore
6
+ # self.path = "/some_other_path" # defaults to: resource_name.pluralized
7
+ # self.format = :json # defaults to :json
8
+
9
+ end
@@ -12,24 +12,95 @@ class Restly::Associations::Base
12
12
  @options = options
13
13
  end
14
14
 
15
- def collection?
16
- false
15
+ def load(parent, options)
16
+
17
+ # Merge Options
18
+ options.reverse_merge!(self.options)
19
+
20
+ # Authorize and Set Path
21
+ association = authorize(options[:authorize]).with_path(parent, options[:path])
22
+
23
+ # Load Collection or Instance
24
+ collection? ? association.load_collection(parent) : association.load_instance(parent)
25
+ end
26
+
27
+ def load_collection(parent, association_class = self.association_class)
28
+ raise Restly::Error::AssociationError, "Not a collection" unless collection?
29
+ Restly::Proxies::Associations::Collection.new(association_class.all, parent)
30
+ end
31
+
32
+ def load_instance(parent, association_class = self.association_class)
33
+ raise Restly::Error::AssociationError, "Not an instance" if collection?
34
+ instance = if (foreign_key = parent.attributes["#{name}_id"])
35
+ association_class.find(foreign_key)
36
+ else
37
+ association_class.instance_from_response association_class.connection.get(association_class.path)
38
+ end
39
+ Restly::Proxies::Associations::Instance.new(instance, parent)
40
+ end
41
+
42
+ def valid?(val)
43
+ valid_instances = Array.wrap(val).reject{ |item| item.resource_name == @association_class.resource_name }.empty?
44
+ raise Restly::Error::InvalidObject, "#{val} is not a #{association_class}" unless valid_instances
45
+ end
46
+
47
+ # Stubs
48
+ def stub(parent, attributes)
49
+ return nil if !parent.is_a?(Restly::Base) || !attributes.present?
50
+ collection? ? stub_collection(parent, attributes) : stub_instance(parent, attributes)
51
+ end
52
+
53
+ def stub_collection(parent, attributes)
54
+ collection = attributes.map{ |item_attrs| association_class.new(item_attrs, loaded: embedded?) }
55
+ Restly::Proxies::Associations::Collection.new(collection, parent)
56
+ end
57
+
58
+ def stub_instance(parent, attributes)
59
+ instance = association_class.new(attributes, loaded: embedded?)
60
+ Restly::Proxies::Associations::Instance.new(instance, parent)
61
+ end
62
+
63
+ # Build
64
+ def build(parent, attributes = nil, options = {})
65
+ raise NoMethodError, "Build not available for collection." if collection?
66
+ instance = association_class.new(attributes, options)
67
+ instance.write_attribute("#{@owner.resource_name}_id", parent.id) if association_class.method_defined?("#{@owner.resource_name}_id")
68
+ Restly::Proxies::Associations::Instance.new(instance, parent)
69
+ end
70
+
71
+ # Modifiers
72
+ def authorize(authorization = nil, association_class=self.association_class)
73
+ duplicate = self.dup
74
+ duplicate.instance_variable_set :@association_class, if (!association_class.authorized? && @owner.respond_to?(:authorized?) && @owner.authorized?) || authorization
75
+ association_class.authorize(authorization || @owner.connection)
76
+ else
77
+ association_class
78
+ end
79
+ duplicate
17
80
  end
18
81
 
19
- def build(*args)
20
- new_instance = @association_class.new(*args)
21
- new_instance.write_attribute("#{@owner.resource_name}_id") if @association_class.respond_to?("#{@owner.resource_name}_id") && !self.class.send(:reflect_on_resource_association, :custom_pages).embedded?
22
- new_instance
82
+ def with_path(parent, path = nil, association_class=self.association_class)
83
+ duplicate = self.dup
84
+ duplicate.instance_variable_set :@association_class, if path
85
+ association_class.with_path(path)
86
+ else
87
+ association_class.with_path(association_resource_name, prepend: parent.path)
88
+ end
89
+ duplicate
23
90
  end
24
91
 
25
92
  private
26
93
 
27
- def authorize(klass, authorization = nil)
28
- if (!klass.authorized? && @owner.respond_to?(:authorized?) && @owner.authorized?) || authorization
29
- klass.authorize(authorization || @owner.connection)
30
- else
31
- klass
32
- end
94
+ def collection?
95
+ false
96
+ end
97
+
98
+ def embedded?
99
+ false
100
+ end
101
+
102
+ def association_resource_name
103
+ collection? ? association_class.resource_name.pluralize : association_class.resource_name
33
104
  end
34
105
 
35
106
  end
@@ -1,11 +1,28 @@
1
1
  class Restly::Associations::BelongsTo < Restly::Associations::Base
2
2
 
3
- def find_with_parent(parent, options)
4
- options.reverse_merge!(self.options)
5
- association_class = polymorphic ? [@namespace, instance.send("#{name}_type")] : self.association_class
6
- association_class = authorize(association_class, options[:authorize])
7
- instance = association_class.find(parent.attributes["#{name}_id"])
8
- Restly::Proxies::Associations::Instance.new(instance, parent)
3
+ def load(parent, options)
4
+ if polymorphic
5
+ set_polymorphic_class(parent).load(parent, options)
6
+ else
7
+ super(parent, options)
8
+ end
9
+ end
10
+
11
+ def set_polymorphic_class(parent)
12
+ duplicate = self.dup
13
+ duplicate.instance_variable_set(:@association_class, parent.send("#{name}_type"))
14
+ duplicate.instance_variable_set(:@polymorphic, false)
15
+ duplicate
16
+ end
17
+
18
+ def with_path(parent, path = nil, association_class=self.association_class)
19
+ duplicate = self.dup
20
+ duplicate.instance_variable_set :@association_class, if path
21
+ association_class.with_path(path)
22
+ else
23
+ association_class
24
+ end
25
+ duplicate
9
26
  end
10
27
 
11
28
  def collection?
@@ -4,4 +4,8 @@ class Restly::Associations::EmbeddableResources::EmbedsMany < Restly::Associatio
4
4
  true
5
5
  end
6
6
 
7
+ def embedded?
8
+ true
9
+ end
10
+
7
11
  end
@@ -4,4 +4,8 @@ class Restly::Associations::EmbeddableResources::EmbedsOne < Restly::Association
4
4
  false
5
5
  end
6
6
 
7
+ def embedded?
8
+ true
9
+ end
10
+
7
11
  end
@@ -10,9 +10,15 @@ module Restly::Associations::EmbeddableResources
10
10
  exclude_field(name) if ancestors.include?(Restly::Base)
11
11
  self.resource_associations[name] = association = EmbedsOne.new(self, name, options)
12
12
 
13
- define_method name do
14
- association.build(attributes[name])
13
+ define_method name do |options={}|
14
+ return get_association(name) if get_association(name).present?
15
+ set_association name, association.stub(self)
15
16
  end
17
+
18
+ define_method "#{name}=" do |value|
19
+ set_association name, value
20
+ end
21
+
16
22
  end
17
23
 
18
24
  # Embeds Many
@@ -20,9 +26,14 @@ module Restly::Associations::EmbeddableResources
20
26
  exclude_field(name) if ancestors.include?(Restly::Base)
21
27
  self.resource_associations[name] = association = EmbedsMany.new(self, name, options)
22
28
 
23
- define_method name do
24
- ( self.attributes[name] || [] ).map!{ |i| association.build(i) }
29
+ define_method name do |options={}|
30
+ get_association(name, options)
25
31
  end
32
+
33
+ define_method "#{name}=" do |value|
34
+ set_association name, value
35
+ end
36
+
26
37
  end
27
38
 
28
39
  end
@@ -7,15 +7,6 @@ class Restly::Associations::HasMany < Restly::Associations::Base
7
7
  super
8
8
  end
9
9
 
10
- def scope_with_parent(parent, options)
11
- options.reverse_merge!(self.options)
12
- association_class = polymorphic ? [@namespace, instance.send("#{name}_type")] : self.association_class
13
- association_class = authorize(association_class, options[:authorize])
14
- collection = association_class.with_params("with_#{parent.resource_name}_id" => parent.id).all # (parent.attributes["#{name}_id"])
15
- collection.select{|i| i.attributes["#{parent.resource_name}_id"] == parent.id }
16
- Restly::Proxies::Associations::Collection.new(collection, parent)
17
- end
18
-
19
10
  def collection?
20
11
  true
21
12
  end
@@ -7,15 +7,6 @@ class Restly::Associations::HasOne < Restly::Associations::Base
7
7
  super
8
8
  end
9
9
 
10
- def scope_with_parent(parent, options)
11
- options.reverse_merge!(self.options)
12
- association_class = polymorphic ? [@namespace, instance.send("#{name}_type")] : self.association_class
13
- association_class = authorize(association_class, options[:authorize])
14
- collection = association_class.with_params("with_#{parent.resource_name}_id" => parent.id).all(parent.attributes["#{name}_id"])
15
- collection.select{|i| i.attributes["#{parent.resource_name}_id"] == parent.id }.first
16
- Restly::Proxies::Associations::Instance.new(instance, parent)
17
- end
18
-
19
10
  def collection?
20
11
  true
21
12
  end
@@ -10,17 +10,30 @@ module Restly::Associations
10
10
  autoload :HasOneThrough
11
11
  autoload :EmbeddableResources
12
12
 
13
- class AssociationHash < HashWithIndifferentAccess
13
+ class AssociationsSet < HashWithIndifferentAccess
14
+ end
15
+
16
+ class IndifferentSet < Set
17
+
18
+ def include?(attr)
19
+ return super unless attr.is_a?(Symbol) || attr.is_a?(String)
20
+ super(attr.to_s) || super(attr.to_sym)
21
+ end
22
+
14
23
  end
15
24
 
16
25
  included do
17
26
 
18
- extend EmbeddableResources if self == Restly::Base
27
+ include Restly::ConcernedInheritance
28
+ extend EmbeddableResources if self == Restly::Base
19
29
  include Restly::NestedAttributes
20
30
 
21
31
  delegate :resource_name, to: :klass
22
32
  class_attribute :resource_associations, instance_reader: false, instance_writer: false
23
- self.resource_associations = AssociationHash.new
33
+
34
+ attr_reader :association_attributes
35
+
36
+ self.resource_associations = AssociationsSet.new
24
37
 
25
38
  inherited do
26
39
  self.resource_associations = resource_associations.dup
@@ -28,12 +41,42 @@ module Restly::Associations
28
41
 
29
42
  end
30
43
 
31
- def stub_associations_from_response(response=self.response)
32
- parsed = response.parsed || {}
33
- parsed = parsed[resource_name] if parsed.is_a?(Hash) && parsed[resource_name]
34
- associations = parsed.select{ |i| klass.reflect_on_all_resource_associations.keys.include?(i) }
35
- associations.each do |relationship|
36
- relationship.collection?
44
+ def associations
45
+ IndifferentSet.new klass.reflect_on_all_resource_associations.keys.map(&:to_sym)
46
+ end
47
+
48
+ def set_association(attr, val)
49
+ association = klass.reflect_on_resource_association(attr)
50
+ association.valid?(val)
51
+ @association_attributes[attr] = val
52
+ end
53
+
54
+ def get_association(attr, options={})
55
+ association = klass.reflect_on_resource_association(attr)
56
+ (@association_attributes ||= {}.with_indifferent_access)[attr] || set_association(attr, association.load(self, options))
57
+ end
58
+
59
+ def respond_to_association?(m)
60
+ !!(/(?<attr>\w+)(?<setter>=)?$/ =~ m.to_s) && associations.include?(attr.to_sym)
61
+ end
62
+
63
+ def respond_to?(m, include_private = false)
64
+ respond_to_association?(m) || super
65
+ end
66
+
67
+ private
68
+
69
+ def method_missing(m, *args, &block)
70
+ if !!(/(?<attr>\w+)(?<setter>=)?$/ =~ m.to_s) && associations.include?(m)
71
+ attr = attr.to_sym
72
+ case !!setter
73
+ when true
74
+ set_association(attr, *args)
75
+ when false
76
+ get_association(attr)
77
+ end
78
+ else
79
+ super(m, *args, &block)
37
80
  end
38
81
  end
39
82
 
@@ -47,6 +90,10 @@ module Restly::Associations
47
90
  name.gsub(/.*::/,'').underscore
48
91
  end
49
92
 
93
+ def reflect_on_resource_association(association_name)
94
+ reflect_on_all_resource_associations[association_name]
95
+ end
96
+
50
97
  def reflect_on_all_resource_associations
51
98
  resource_associations
52
99
  end
@@ -57,32 +104,45 @@ module Restly::Associations
57
104
  def belongs_to_resource(name, options = {})
58
105
  exclude_field(name) if ancestors.include?(Restly::Base)
59
106
  self.resource_associations[name] = association = BelongsTo.new(self, name, options)
107
+
60
108
  define_method name do |options={}|
61
- association.find_with_parent(self, options)
109
+ get_association(name, options)
110
+ end
111
+
112
+ define_method "#{name}=" do |value|
113
+ set_association name, value
62
114
  end
115
+
63
116
  end
64
117
 
65
118
  # Has One
66
119
  def has_one_resource(name, options = {})
67
120
  exclude_field(name) if ancestors.include?(Restly::Base)
68
121
  self.resource_associations[name] = association = HasOne.new(self, name, options)
122
+
69
123
  define_method name do |options={}|
70
- association.scope_with_parent(self, options)
124
+ get_association(name, options)
125
+ end
126
+
127
+ define_method "#{name}=" do |value|
128
+ set_association name, value
71
129
  end
130
+
72
131
  end
73
132
 
74
133
  # Has One
75
134
  def has_many_resources(name, options = {})
76
135
  exclude_field(name) if ancestors.include?(Restly::Base)
77
136
  self.resource_associations[name] = association = HasMany.new(self, name, options)
137
+
78
138
  define_method name do |options={}|
79
- association.scope_with_parent(self, options)
139
+ get_association(name, options)
80
140
  end
81
- end
82
141
 
142
+ define_method "#{name}=" do |value|
143
+ set_association name, value
144
+ end
83
145
 
84
- def reflect_on_resource_association(association_name)
85
- reflect_on_all_resource_associations[association_name]
86
146
  end
87
147
 
88
148
  end
@@ -1,11 +1,15 @@
1
1
  module Restly::Base::GenericMethods
2
2
 
3
3
  def authorize(token_object)
4
- Restly::Proxies::Auth.new self, token_object
4
+ Restly::Proxies::Authorization.new self, token_object
5
5
  end
6
6
 
7
7
  def with_params(params={})
8
- Restly::Proxies::Params.new self, params
8
+ Restly::Proxies::WithParams.new self, params
9
+ end
10
+
11
+ def with_path(*args)
12
+ Restly::Proxies::WithPath.new self, *args
9
13
  end
10
14
 
11
15
  def path_with_format(*args)
@@ -21,4 +25,8 @@ module Restly::Base::GenericMethods
21
25
  connection.token.present?
22
26
  end
23
27
 
28
+ def proxied?
29
+ true
30
+ end
31
+
24
32
  end
@@ -1,18 +1,6 @@
1
1
  module Restly::Base::Includes
2
2
  extend ActiveSupport::Concern
3
3
 
4
- included do
5
- extend ClassMethods
6
-
7
- class_attribute :inherited_callbacks
8
- self.inherited_callbacks = []
9
-
10
- inherited do
11
- self.inherited_callbacks = inherited_callbacks
12
- end
13
-
14
- end
15
-
16
4
  module ClassMethods
17
5
 
18
6
  # Delegate stuff to client
@@ -38,16 +26,6 @@ module Restly::Base::Includes
38
26
  resource_name
39
27
  end
40
28
 
41
- private
42
-
43
- def inherited(subclass = nil, &block)
44
- self.inherited_callbacks << block and return if block_given?
45
-
46
- inherited_callbacks.each do |call_block|
47
- subclass.class_eval(&call_block)
48
- end
49
- end
50
-
51
29
  end
52
30
 
53
31
  end