conject 0.0.9 → 0.1.0

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.
data/CHANGELOG CHANGED
@@ -1,3 +1,14 @@
1
+ Conject v0.1.0
2
+ * All objects now have a public accessor object_context
3
+ * provide_with_objects can be used like construct_with, except it sets up lazy use-time resolution of dependencies
4
+ * ObjectContext#put now raises if you accidentally re-register an object with the same name
5
+
6
+ Conject v0.0.9
7
+ * Classes with module namespaces can now refer to collaborators in construct_with by omitting the full path corresponding to the object namespace
8
+
9
+ Conject v0.0.8
10
+ * peer_objects lets you declare within one object that if some subcontext should request an object, that object should be instantiated in THIS context
11
+
1
12
  Conject v0.0.7
2
13
  (re-release due to release automation fail on my part)
3
14
  Conject v0.0.6
@@ -9,7 +9,7 @@ Gem::Specification.new do |gem|
9
9
  gem.homepage = "https://github.com/dcrosby42/conject"
10
10
 
11
11
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
- gem.files = `git ls-files`.split("\n")
12
+ gem.files = `git ls-files`.split("\n") - [".gitignore", ".rspec", ".rvmrc", "NOTES.txt", "TODO"]
13
13
  gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
14
  gem.name = "conject"
15
15
  gem.require_paths = ["lib"]
@@ -2,8 +2,11 @@ require "conject/version"
2
2
 
3
3
  require 'conject/object_definition'
4
4
  require 'conject/extended_metaid'
5
+ require 'conject/class_ext_object_context'
6
+ require 'conject/object_ext_object_context'
5
7
  require 'conject/class_ext_construct_with'
6
8
  require 'conject/class_ext_object_peers'
9
+ require 'conject/class_ext_provide_with_objects'
7
10
  require 'conject/object_context'
8
11
  require 'conject/object_factory'
9
12
  require 'conject/class_finder'
@@ -37,4 +40,17 @@ module Conject
37
40
  :object_factory => object_factory
38
41
  )
39
42
  end
43
+
44
+ def self.install_object_context(target, context)
45
+ target.instance_variable_set(:@_conject_object_context, context)
46
+ end
47
+
48
+ def self.override_object_context_with(object_context, &block)
49
+ Thread.current[:_overriding_conject_object_context] = object_context
50
+ begin
51
+ block.call
52
+ ensure
53
+ Thread.current[:_overriding_conject_object_context] = nil
54
+ end
55
+ end
40
56
  end
@@ -0,0 +1,5 @@
1
+ class Class
2
+ def object_context
3
+ Conject.default_object_context
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ require 'conject/utilities'
2
+ class Class
3
+ def provide_with_objects(*syms)
4
+ klass = self
5
+
6
+ # Define an internal reader method per dependency:
7
+ syms.each do |object_name|
8
+ mname = Conject::Utilities.generate_accessor_method_name(object_name)
9
+ class_def_private mname do
10
+ object_context[object_name]
11
+ end
12
+ end
13
+ end
14
+ end
@@ -10,6 +10,8 @@ module Conject
10
10
 
11
11
  # Inject a named object into this context
12
12
  def put(name, object)
13
+ raise "This ObjectContext already has an instance or configuration for '#{name.to_s}'" if directly_has?(name)
14
+ Conject.install_object_context(object, self)
13
15
  @cache[name.to_sym] = object
14
16
  end
15
17
 
@@ -81,6 +83,11 @@ module Conject
81
83
  @object_configs[name.to_sym] || {}
82
84
  end
83
85
 
86
+ def inspect
87
+ "<ObjectContext 0x#{object_id.to_s(16)}>"
88
+ end
89
+ alias :to_s :inspect
90
+
84
91
  private
85
92
 
86
93
  #
@@ -0,0 +1,5 @@
1
+ class Object
2
+ def object_context
3
+ @_conject_object_context || Thread.current[:_overriding_conject_object_context] || Conject.default_object_context
4
+ end
5
+ end
@@ -18,14 +18,6 @@ module Conject
18
18
  else
19
19
  raise "Constructor lambda takes 0, 1 or 2 params; this lambda takes #{lambda_constructor.arity}"
20
20
  end
21
-
22
- # Provide a private accessor to the assigned object context
23
- class << object
24
- private
25
- def object_context
26
- @_conject_object_context #|| Conject.default_object_context
27
- end
28
- end
29
21
  else
30
22
  object = type_1_constructor(name, object_context)
31
23
  end
@@ -50,11 +42,6 @@ module Conject
50
42
  anchor_object_peers object_context, klass.object_peers
51
43
  end
52
44
 
53
- # Provide a private accessor to the assigned object context
54
- klass.class_def_private :object_context do
55
- @_conject_object_context || Thread.current[:current_object_context] #|| Conject.default_object_context
56
- end
57
-
58
45
  constructor_func = nil
59
46
  if klass.has_object_definition?
60
47
  object_map = dependency_resolver.resolve_for_class(klass, object_context)
@@ -63,26 +50,15 @@ module Conject
63
50
  elsif Utilities.has_zero_arg_constructor?(klass)
64
51
  # Default construction
65
52
  constructor_func = lambda do klass.new end
66
- Thread.current[:current_object_context] = object_context
67
- begin
68
- ensure
69
- Thread.current[:current_object_context] = nil
70
- end
71
53
  else
72
54
  # Oops, out of ideas on how to build.
73
55
  raise ArgumentError.new("Class #{klass} has no special component needs, but neither does it have a zero-argument constructor.");
74
56
  end
75
57
 
76
58
  object = nil
77
- Thread.current[:current_object_context] = object_context
78
- begin
59
+ Conject.override_object_context_with object_context do
79
60
  object = constructor_func.call
80
- ensure
81
- Thread.current[:current_object_context] = nil
82
61
  end
83
-
84
- return object
85
-
86
62
  end
87
63
 
88
64
  def anchor_object_peers(object_context, object_peers)
@@ -1,3 +1,3 @@
1
1
  module Conject
2
- VERSION = "0.0.9"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,36 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe "lazy dependency resolution via provide_with_objects" do
4
+ subject { new_object_context }
5
+
6
+ before do
7
+ append_test_load_path "lazy_resolution"
8
+ require 'hobbit/baggins'
9
+ require 'hobbit/shire'
10
+ require 'hobbit/precious'
11
+ require 'hobbit/smeagol'
12
+ end
13
+
14
+ after do
15
+ restore_load_path
16
+ end
17
+
18
+ describe "for 'regular' context objects (instances)" do
19
+ it "provides objects" do
20
+ baggins = subject["hobbit/baggins"]
21
+ baggins.to_s.should == "From the Shire, found the One Ring"
22
+ end
23
+
24
+ it "can use deps inside #initialize" do
25
+ gollum = subject["hobbit/smeagol"]
26
+ gollum.saying.should == "They stole it from us, precious One Ring"
27
+ end
28
+ end
29
+
30
+ describe "mixed lazy and construct with"
31
+ describe "provide SELF with objects"
32
+ describe "objects injected into context after construction"
33
+ describe "module-relative dep names"
34
+
35
+ end
36
+
@@ -81,7 +81,7 @@ describe "basic inheritance" do
81
81
  it "invokes subclass custom #initialize with component map" do
82
82
  fur = subject[:fur]
83
83
  tree = subject[:tree]
84
- chauncy.got_map.should == { fur: fur, tree: tree }
84
+ chauncy.got_map.should == { :fur => fur, :tree => tree }
85
85
  end
86
86
 
87
87
  it "invokes superclass #initialize" do
@@ -150,7 +150,7 @@ describe "basic inheritance" do
150
150
  class Shell; end
151
151
 
152
152
  it "invokes super #initialize with component map" do
153
- subject[:reptile].super_map.should == { scales: subject[:scales] }
153
+ subject[:reptile].super_map.should == { :scales => subject[:scales] }
154
154
  end
155
155
 
156
156
  context "subclass has default #initialize" do
@@ -159,7 +159,7 @@ describe "basic inheritance" do
159
159
  end
160
160
 
161
161
  it "invokes superclass #initialize" do
162
- subject[:reptile].super_map.should == { scales: subject[:scales] }
162
+ subject[:reptile].super_map.should == { :scales => subject[:scales] }
163
163
  end
164
164
  end
165
165
 
@@ -178,13 +178,13 @@ describe "basic inheritance" do
178
178
  it "invokes subclass custom #initialize with component map" do
179
179
  scales = subject[:scales]
180
180
  rock = subject[:rock]
181
- harry.got_map.should == { scales: scales, rock: rock }
181
+ harry.got_map.should == { :scales => scales, :rock => rock }
182
182
  end
183
183
 
184
184
  it "invokes superclass #initialize with component_map" do
185
185
  scales = subject[:scales]
186
186
  rock = subject[:rock]
187
- harry.super_map.should == { scales: scales, rock: rock }
187
+ harry.super_map.should == { :scales => scales, :rock => rock }
188
188
  end
189
189
  end
190
190
 
@@ -239,7 +239,7 @@ describe "basic inheritance" do
239
239
 
240
240
  it "does not invoke superclass #initiailize" do
241
241
  subject[:croc].super_map.should be_nil
242
- subject[:croc].my_map.should == { scales: subject[:scales] }
242
+ subject[:croc].my_map.should == { :scales => subject[:scales] }
243
243
  end
244
244
 
245
245
  end
@@ -1,12 +1,13 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
2
 
3
- describe "object referencing its own context" do
3
+ describe "object_context:" do
4
4
  subject { new_object_context }
5
5
 
6
6
  before do
7
7
  append_test_load_path "basic_composition"
8
- require 'master_of_puppets'
8
+ require 'kill_em_all'
9
9
  require 'ride_the_lightning'
10
+ require 'master_of_puppets'
10
11
  require 'and_justice_for_all'
11
12
  end
12
13
 
@@ -14,47 +15,120 @@ describe "object referencing its own context" do
14
15
  restore_load_path
15
16
  end
16
17
 
17
- it "ObjectContext caches a reference to itself using the name :this_object_context" do
18
- subject[:this_object_context].should == subject
19
- end
18
+ describe "NEW AND IMPROVED" do
20
19
 
21
- it "an object can inject :this_object_context as a reference to its constructing ObjectContext" do
22
- master = subject.get('master_of_puppets')
23
- master.this_object_context.should == subject
20
+ describe "Class" do
21
+ it "has the default object context" do
22
+ Class.object_context.should == Conject.default_object_context
23
+ end
24
+ end
24
25
 
25
- master.this_object_context.get('master_of_puppets').should == master
26
- end
26
+ describe "Object" do
27
+ it "has the default object context at the class level" do
28
+ Object.object_context.should == Conject.default_object_context
29
+ end
30
+ it "has the default object context at the instance level" do
31
+ Object.new.object_context.should == Conject.default_object_context
32
+ "whatever".object_context.should == Conject.default_object_context
33
+ 42.object_context.should == Conject.default_object_context
34
+ end
35
+ end
27
36
 
28
- describe "NEW AND IMPROVED" do
37
+ describe "any ol' instance" do
38
+ class FadeToBlack
39
+ end
29
40
 
30
- describe "classes with object definitions" do
41
+ let(:context1) { new_object_context }
42
+ let(:context2) { new_object_context }
43
+ let(:fade1) { FadeToBlack.new }
44
+ let(:fade2) { FadeToBlack.new }
45
+
46
+ it "can have object_context specified" do
47
+ Conject.install_object_context fade1, context1
48
+ fade1.object_context.should == context1
49
+ fade2.object_context.should == Conject.default_object_context
50
+ end
51
+
52
+ it "can have the default object context overridden by Thread-local settings" do
53
+ fade1.object_context.should == Conject.default_object_context
54
+
55
+ Conject.override_object_context_with(context2) do
56
+ fade1.object_context.should == context2
57
+ end
58
+
59
+ fade1.object_context.should == Conject.default_object_context
60
+ end
61
+
62
+ it "will prefer its installed object context to the magic override" do
63
+ Conject.install_object_context fade1, context1
64
+ fade1.object_context.should == context1
65
+
66
+ Conject.override_object_context_with(context2) do
67
+ fade1.object_context.should == context1 # shouldn't change
68
+ end
69
+
70
+ fade1.object_context.should == context1
71
+ end
72
+ end
73
+
74
+ describe "classes using construct_with" do
31
75
  let(:justice) { subject.get('and_justice_for_all') }
32
76
  let(:ride) { subject.get('ride_the_lightning') }
33
77
 
34
78
  it "automatically get a private accessor for object_context, even if not requested" do
35
- justice.send(:object_context).should == subject
36
- ride.send(:object_context).should == subject # watching out for interaction bugs wrt dependency construction
79
+ justice.object_context.should == subject
80
+ ride.object_context.should == subject # watching out for interaction bugs wrt dependency construction
37
81
  end
38
82
 
39
83
  it "can use object_context in initialize" do
40
84
  justice.init_time_object_context.should == subject
41
85
  ride.init_time_object_context.should == subject # watching out for interaction bugs wrt dependency construction
42
86
  end
87
+
88
+ it "will get object_context assigned as a result of being set into a context" do
89
+ obj = AndJusticeForAll.new(ride_the_lightning: 'doesnt matter')
90
+ obj.object_context.should == Conject.default_object_context
91
+
92
+ c2 = new_object_context
93
+ c2[:my_obj] = obj
94
+ obj.object_context.should == c2
95
+ end
43
96
  end
44
97
 
45
- describe "classes WITHOUT object definitions" do
98
+ describe "classes NOT using construct_with" do
46
99
  let(:ride) { subject.get('ride_the_lightning') }
47
100
 
48
101
  it "automatically get a private accessor for object_context, even if not requested" do
49
- ride.send(:object_context).should == subject
102
+ ride.object_context.should == subject
50
103
  end
51
104
 
52
105
  it "can use object_context in initialize" do
53
106
  ride.init_time_object_context.should == subject
54
107
  end
108
+
109
+ it "will get object_context assigned as a result of being set into a context" do
110
+ obj = KillEmAll.new
111
+ obj.object_context.should == Conject.default_object_context
112
+
113
+ c2 = new_object_context
114
+ c2[:my_obj] = obj
115
+ obj.object_context.should == c2
116
+ end
55
117
  end
56
118
 
57
119
  end
58
120
 
121
+ describe "OLD SCHOOL :this_object_context" do
122
+ it "ObjectContext caches a reference to itself using the name :this_object_context" do
123
+ subject[:this_object_context].should == subject
124
+ end
125
+
126
+ it "an object can inject :this_object_context as a reference to its constructing ObjectContext" do
127
+ master = subject.get('master_of_puppets')
128
+ master.this_object_context.should == subject
129
+
130
+ master.this_object_context.get('master_of_puppets').should == master
131
+ end
132
+ end
59
133
  end
60
134
 
@@ -87,6 +87,18 @@ describe Conject::ObjectContext do
87
87
  end
88
88
  end
89
89
 
90
+ describe "#put?" do
91
+ it "raises an error if the context already has an object with the given name" do
92
+ subject[:jack] = :sparrow
93
+ lambda do subject[:jack] = :and_jill end.should raise_error /jack/
94
+ end
95
+
96
+ it "raises an error if the context has a config for the given name, even if no object has been instantiated or registered yet" do
97
+ subject.configure_objects davie: { cache: false }
98
+ lambda do subject[:davie] = :jones end.should raise_error /davie/
99
+ end
100
+ end
101
+
90
102
  describe "#has?" do
91
103
  describe "when the object exists in the cache" do
92
104
  describe "due to #put" do
@@ -152,8 +164,16 @@ describe Conject::ObjectContext do
152
164
  end
153
165
 
154
166
  describe "when the object does NOT exist in the cache" do
155
- it "returns false" do
156
- subject.directly_has?(:a_clue).should == false
167
+ describe "and there's no config for the object" do
168
+ it "returns false" do
169
+ subject.directly_has?(:a_clue).should == false
170
+ end
171
+ end
172
+ describe "and there IS a config for the object" do
173
+ it "returns true" do
174
+ subject.configure_objects :a_clue => { :cache => false }
175
+ subject.directly_has?(:a_clue).should == true
176
+ end
157
177
  end
158
178
  end
159
179
  end
@@ -211,4 +231,13 @@ describe Conject::ObjectContext do
211
231
  # end
212
232
 
213
233
  end
234
+
235
+ describe "#inspect and #to_s" do
236
+ it "shows a custom string based on object_id" do
237
+ c = subject
238
+ obj_id_hex = c.object_id.to_s(16)
239
+ c.inspect.should == "<ObjectContext 0x#{obj_id_hex}>"
240
+ c.to_s.should == "<ObjectContext 0x#{obj_id_hex}>"
241
+ end
242
+ end
214
243
  end
@@ -4,6 +4,10 @@ class AndJusticeForAll
4
4
  attr_reader :init_time_object_context
5
5
 
6
6
  def initialize
7
- @init_time_object_context = object_context
7
+ @init_time_object_context = begin
8
+ object_context
9
+ rescue
10
+ nil
11
+ end
8
12
  end
9
13
  end
@@ -0,0 +1,2 @@
1
+ class KillEmAll
2
+ end
@@ -0,0 +1,9 @@
1
+ module Hobbit
2
+ class Baggins
3
+ provide_with_objects "hobbit/shire", "hobbit/precious"
4
+
5
+ def to_s
6
+ "From the #{shire}, found the #{precious}"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+
2
+ module Hobbit
3
+ class Precious
4
+ def to_s
5
+ "One Ring"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+
2
+ module Hobbit
3
+ class Shire
4
+ def to_s
5
+ "Shire"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ module Hobbit
2
+ class Smeagol
3
+ provide_with_objects "hobbit/precious"
4
+
5
+ attr_reader :saying
6
+
7
+ def initialize
8
+ @saying = "They stole it from us, precious #{precious}"
9
+ end
10
+ end
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: conject
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-17 00:00:00.000000000 Z
12
+ date: 2012-12-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -82,26 +82,25 @@ executables: []
82
82
  extensions: []
83
83
  extra_rdoc_files: []
84
84
  files:
85
- - .gitignore
86
- - .rvmrc
87
85
  - CHANGELOG
88
86
  - Gemfile
89
- - NOTES.txt
90
87
  - README.md
91
88
  - Rakefile
92
- - TODO
93
89
  - conject.gemspec
94
90
  - doc/inheritance_woes.txt
95
91
  - lib/conject.rb
96
92
  - lib/conject/borrowed_active_support_inflector.rb
97
93
  - lib/conject/class_ext_construct_with.rb
94
+ - lib/conject/class_ext_object_context.rb
98
95
  - lib/conject/class_ext_object_peers.rb
96
+ - lib/conject/class_ext_provide_with_objects.rb
99
97
  - lib/conject/class_finder.rb
100
98
  - lib/conject/composition_error.rb
101
99
  - lib/conject/dependency_resolver.rb
102
100
  - lib/conject/extended_metaid.rb
103
101
  - lib/conject/object_context.rb
104
102
  - lib/conject/object_definition.rb
103
+ - lib/conject/object_ext_object_context.rb
105
104
  - lib/conject/object_factory.rb
106
105
  - lib/conject/utilities.rb
107
106
  - lib/conject/version.rb
@@ -118,7 +117,7 @@ files:
118
117
  - scratch/sample.rb
119
118
  - scratch/special_construct.rb
120
119
  - spec/acceptance/dev/README
121
- - spec/acceptance/dev/module_scoping_spec.rb
120
+ - spec/acceptance/dev/provide_with_objects_spec.rb
122
121
  - spec/acceptance/regression/README
123
122
  - spec/acceptance/regression/basic_composition_spec.rb
124
123
  - spec/acceptance/regression/basic_object_creation_spec.rb
@@ -126,6 +125,7 @@ files:
126
125
  - spec/acceptance/regression/default_object_context_spec.rb
127
126
  - spec/acceptance/regression/inherited_dependencies_spec.rb
128
127
  - spec/acceptance/regression/inject_object_context_spec.rb
128
+ - spec/acceptance/regression/module_scoping_spec.rb
129
129
  - spec/acceptance/regression/nested_contexts_spec.rb
130
130
  - spec/acceptance/regression/non_singleton_spec.rb
131
131
  - spec/acceptance/regression/object_peers_spec.rb
@@ -148,6 +148,7 @@ files:
148
148
  - spec/test_data/basic_composition/front_desk.rb
149
149
  - spec/test_data/basic_composition/grass.rb
150
150
  - spec/test_data/basic_composition/guest.rb
151
+ - spec/test_data/basic_composition/kill_em_all.rb
151
152
  - spec/test_data/basic_composition/lobby.rb
152
153
  - spec/test_data/basic_composition/master_of_puppets.rb
153
154
  - spec/test_data/basic_composition/nails.rb
@@ -162,6 +163,10 @@ files:
162
163
  - spec/test_data/inheritance/malibu.rb
163
164
  - spec/test_data/inheritance/vehicle.rb
164
165
  - spec/test_data/inheritance/wheel.rb
166
+ - spec/test_data/lazy_resolution/hobbit/baggins.rb
167
+ - spec/test_data/lazy_resolution/hobbit/precious.rb
168
+ - spec/test_data/lazy_resolution/hobbit/shire.rb
169
+ - spec/test_data/lazy_resolution/hobbit/smeagol.rb
165
170
  - spec/test_data/namespace/chart/model.rb
166
171
  - spec/test_data/namespace/chart/presenter.rb
167
172
  - spec/test_data/namespace/chart/view.rb
@@ -192,7 +197,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
192
197
  version: '0'
193
198
  segments:
194
199
  - 0
195
- hash: -1030399323888719184
200
+ hash: -4433957660980631745
196
201
  required_rubygems_version: !ruby/object:Gem::Requirement
197
202
  none: false
198
203
  requirements:
@@ -201,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
201
206
  version: '0'
202
207
  segments:
203
208
  - 0
204
- hash: -1030399323888719184
209
+ hash: -4433957660980631745
205
210
  requirements: []
206
211
  rubyforge_project:
207
212
  rubygems_version: 1.8.24
@@ -210,7 +215,7 @@ specification_version: 3
210
215
  summary: Enable Guice-like dependency injection and contextual object interactions.
211
216
  test_files:
212
217
  - spec/acceptance/dev/README
213
- - spec/acceptance/dev/module_scoping_spec.rb
218
+ - spec/acceptance/dev/provide_with_objects_spec.rb
214
219
  - spec/acceptance/regression/README
215
220
  - spec/acceptance/regression/basic_composition_spec.rb
216
221
  - spec/acceptance/regression/basic_object_creation_spec.rb
@@ -218,6 +223,7 @@ test_files:
218
223
  - spec/acceptance/regression/default_object_context_spec.rb
219
224
  - spec/acceptance/regression/inherited_dependencies_spec.rb
220
225
  - spec/acceptance/regression/inject_object_context_spec.rb
226
+ - spec/acceptance/regression/module_scoping_spec.rb
221
227
  - spec/acceptance/regression/nested_contexts_spec.rb
222
228
  - spec/acceptance/regression/non_singleton_spec.rb
223
229
  - spec/acceptance/regression/object_peers_spec.rb
@@ -240,6 +246,7 @@ test_files:
240
246
  - spec/test_data/basic_composition/front_desk.rb
241
247
  - spec/test_data/basic_composition/grass.rb
242
248
  - spec/test_data/basic_composition/guest.rb
249
+ - spec/test_data/basic_composition/kill_em_all.rb
243
250
  - spec/test_data/basic_composition/lobby.rb
244
251
  - spec/test_data/basic_composition/master_of_puppets.rb
245
252
  - spec/test_data/basic_composition/nails.rb
@@ -254,6 +261,10 @@ test_files:
254
261
  - spec/test_data/inheritance/malibu.rb
255
262
  - spec/test_data/inheritance/vehicle.rb
256
263
  - spec/test_data/inheritance/wheel.rb
264
+ - spec/test_data/lazy_resolution/hobbit/baggins.rb
265
+ - spec/test_data/lazy_resolution/hobbit/precious.rb
266
+ - spec/test_data/lazy_resolution/hobbit/shire.rb
267
+ - spec/test_data/lazy_resolution/hobbit/smeagol.rb
257
268
  - spec/test_data/namespace/chart/model.rb
258
269
  - spec/test_data/namespace/chart/presenter.rb
259
270
  - spec/test_data/namespace/chart/view.rb
data/.gitignore DELETED
@@ -1,7 +0,0 @@
1
- /coverage
2
- tags
3
- *.swp
4
- *.swo
5
- pkg
6
- /README.html
7
- Gemfile.lock
data/.rvmrc DELETED
@@ -1,2 +0,0 @@
1
- rvm_gemset_create_on_use_flag=1
2
- rvm 1.9.3@object_context
data/NOTES.txt DELETED
@@ -1,61 +0,0 @@
1
-
2
- # Jan 2012
3
-
4
- # Requesting an object from a Context
5
- # if object exists in current context
6
- # return it
7
- # else
8
- # if a super context has the object
9
- # use the object from the super context
10
- # else
11
- # create the object
12
- # store in this Context as a singleton
13
- # return the object
14
- #
15
- # Special case: an object being created within a subcontext requires a
16
- # component that SHOULD be defined in the supercontext
17
- # BUT has not yet been created.
18
- #
19
- # Support a request-time option :from_super => [ :obj1, :obj2]
20
- #
21
- #
22
- # Special case: an object being created within a subcontext requires a
23
- # component that SHOULD be defined in that SAME subcontext,
24
- # but whose name overlaps with an object already defined in
25
- # the SUPER context.
26
- #
27
- # Suppoer a request-time option :define_own => [ :obj1, :obj2]
28
- # (:hide_in_super ? name debatable)
29
- #
30
- #
31
- #
32
-
33
- # Dec 2011
34
-
35
- # Term: REGULAR OBJECT
36
- # Instance of some class with 0 or more components
37
-
38
- #
39
- # Object definitions
40
- # Manually add to context by name
41
- # Indirectly added to context by meta programming in concerned class
42
- # Generated defaults
43
- #
44
- # If no def exists
45
- # if require_on_demand is true
46
- # require guessed library name
47
- # if def still not exist
48
- # generate default def
49
- #
50
- # Use def to construct object
51
- #
52
- # ? when a class uses meta programming to define aspects of itself
53
- # we are not yet in a context for certain.
54
- # We could assume global context but that isn't always right.
55
- #
56
- # REAL QUESTION:
57
- # How do we define non-global contexts conveniently?
58
- # :w
59
- #
60
-
61
-
data/TODO DELETED
@@ -1,28 +0,0 @@
1
- ISSUE 2012-04-25: construct_with cyclic dependency checking! Eg. Presenter construc_with :presenter -> stack overlow
2
- ISSUE 2012-04-30: prevent #put for already-existant objects
3
- ISSUE 2012-04-30: prevent #configure_object(s) for already-existant objects
4
-
5
- Features:
6
- customer construction lambda via configure_objects
7
-
8
- Class singletons:
9
- use_class_in_context
10
- class_depends_on
11
-
12
- context.configure( :use_class_singletons => true)
13
-
14
- ObjectContext#no_cache? <- reimplement for recursive upward search of object configs
15
-
16
- contexts can accept configurations targeted at named subcontext
17
-
18
- Support classes namespaced to modules
19
-
20
- Conject.new_object_context (support no-args, default parent context to nil)
21
-
22
-
23
- Tasks:
24
- GET GOING IN TRAVIS CI
25
-
26
- Cleanup meta programming in .construct_with it's NASTY
27
-
28
-