conject 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
-