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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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