yadic 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.
Files changed (3) hide show
  1. data/README.rdoc +3 -0
  2. data/lib/yadic.rb +53 -0
  3. metadata +68 -0
@@ -0,0 +1,3 @@
1
+ = yadic.rb
2
+
3
+ A lightweight dependency injection container for Ruby. Inspired by Yadic (http://code.google.com/p/yadic/).
@@ -0,0 +1,53 @@
1
+ module Yadic
2
+ class Container
3
+ def add name, klass=nil, &initializer
4
+ add_initializer(name, klass, initializer)
5
+ end
6
+
7
+ def decorate name, klass=nil, &initializer
8
+ add_initializer(name, klass, initializer) do |initializer|
9
+ existing_init = find_initializer(name)
10
+ lambda { initializer.call.decorating(existing_init.call) }
11
+ end
12
+ end
13
+
14
+ def [] name
15
+ find_initializer(name).call
16
+ end
17
+
18
+ class ObjectNotFoundError < StandardError
19
+ def initialize(name) @name=name end
20
+ def message() "No object named #{@name}." end
21
+ end
22
+
23
+ private
24
+ def initializers() @initializers ||= {} end
25
+
26
+ def find_initializer name
27
+ initializers[name] or raise ObjectNotFoundError.new(name)
28
+ end
29
+
30
+ def add_initializer name, klass, initializer, &wrap
31
+ initializer = initializer_from(klass, initializer)
32
+ wrap and initializer = wrap.call(initializer)
33
+ initializers[name] = memoize initializer
34
+ end
35
+
36
+ def memoize initializer
37
+ value = nil
38
+ lambda { value ||= initializer.call }
39
+ end
40
+
41
+ def initializer_from(klass, initializer)
42
+ initializer ? lambda { initializer.call(self) } : lambda { klass.new }
43
+ end
44
+ end
45
+
46
+ module Decorator
47
+ attr_reader :wrapped
48
+ def decorating(wrapped)
49
+ @wrapped = wrapped
50
+ self
51
+ end
52
+ end
53
+ end
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yadic
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Ben Butler-Cole
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-06-08 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description:
23
+ email: ben@bridesmere.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - README.rdoc
32
+ - lib/yadic.rb
33
+ has_rdoc: true
34
+ homepage: http://github.com/benbc/yadic.rb
35
+ licenses: []
36
+
37
+ post_install_message:
38
+ rdoc_options: []
39
+
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ hash: 3
48
+ segments:
49
+ - 0
50
+ version: "0"
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ requirements: []
61
+
62
+ rubyforge_project:
63
+ rubygems_version: 1.3.7
64
+ signing_key:
65
+ specification_version: 3
66
+ summary: A lightweight dependency injection container.
67
+ test_files: []
68
+