copland 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/doc/README +88 -0
- data/doc/manual-html/chapter-1.html +454 -0
- data/doc/manual-html/chapter-10.html +399 -0
- data/doc/manual-html/chapter-11.html +600 -0
- data/doc/manual-html/chapter-12.html +406 -0
- data/doc/manual-html/chapter-2.html +382 -0
- data/doc/manual-html/chapter-3.html +424 -0
- data/doc/manual-html/chapter-4.html +432 -0
- data/doc/manual-html/chapter-5.html +381 -0
- data/doc/manual-html/chapter-6.html +364 -0
- data/doc/manual-html/chapter-7.html +434 -0
- data/doc/manual-html/chapter-8.html +373 -0
- data/doc/manual-html/chapter-9.html +324 -0
- data/doc/manual-html/copland.png +0 -0
- data/doc/manual-html/index.html +331 -0
- data/doc/manual-html/manual.css +179 -0
- data/doc/manual-html/tutorial-1.html +407 -0
- data/doc/manual-html/tutorial-2.html +451 -0
- data/doc/manual-html/tutorial-3.html +484 -0
- data/doc/manual-html/tutorial-4.html +446 -0
- data/doc/manual-html/tutorial-5.html +520 -0
- data/doc/manual/chapter.erb +18 -0
- data/doc/manual/example.erb +18 -0
- data/doc/manual/img/copland.png +0 -0
- data/doc/manual/index.erb +30 -0
- data/doc/manual/manual.css +179 -0
- data/doc/manual/manual.rb +239 -0
- data/doc/manual/manual.yml +2643 -0
- data/doc/manual/page.erb +102 -0
- data/doc/manual/tutorial.erb +30 -0
- data/doc/packages/copland.html +764 -0
- data/doc/packages/copland.lib.html +439 -0
- data/doc/packages/copland.remote.html +2096 -0
- data/doc/packages/copland.webrick.html +925 -0
- data/doc/packages/index.html +49 -0
- data/doc/packages/packrat.css +125 -0
- data/examples/calc/calc.rb +47 -0
- data/examples/calc/package.yml +35 -0
- data/examples/calc/services.rb +74 -0
- data/examples/solitaire-cipher/README +11 -0
- data/examples/solitaire-cipher/Rakefile +57 -0
- data/examples/solitaire-cipher/bin/main.rb +14 -0
- data/examples/solitaire-cipher/lib/cipher.rb +230 -0
- data/examples/solitaire-cipher/lib/cli.rb +24 -0
- data/examples/solitaire-cipher/lib/package.yml +106 -0
- data/examples/solitaire-cipher/test/tc_deck.rb +30 -0
- data/examples/solitaire-cipher/test/tc_key-stream.rb +19 -0
- data/examples/solitaire-cipher/test/tc_keying-algorithms.rb +31 -0
- data/examples/solitaire-cipher/test/tc_solitaire-cipher.rb +66 -0
- data/examples/solitaire-cipher/test/tc_unkeyed-algorithm.rb +17 -0
- data/examples/solitaire-cipher/test/tests.rb +2 -0
- data/lib/copland.rb +56 -0
- data/lib/copland/class-factory.rb +95 -0
- data/lib/copland/configuration-point.rb +38 -0
- data/lib/copland/configuration-point/common.rb +203 -0
- data/lib/copland/configuration-point/errors.rb +44 -0
- data/lib/copland/configuration-point/list.rb +59 -0
- data/lib/copland/configuration-point/map.rb +59 -0
- data/lib/copland/configuration/errors.rb +43 -0
- data/lib/copland/configuration/loader.rb +113 -0
- data/lib/copland/configuration/yaml/configuration-point.rb +87 -0
- data/lib/copland/configuration/yaml/implementor.rb +134 -0
- data/lib/copland/configuration/yaml/interceptor.rb +63 -0
- data/lib/copland/configuration/yaml/listener.rb +56 -0
- data/lib/copland/configuration/yaml/loader.rb +122 -0
- data/lib/copland/configuration/yaml/package.rb +125 -0
- data/lib/copland/configuration/yaml/parser.rb +71 -0
- data/lib/copland/configuration/yaml/schema.rb +165 -0
- data/lib/copland/configuration/yaml/service-point.rb +116 -0
- data/lib/copland/configuration/yaml/utils.rb +82 -0
- data/lib/copland/default-schema-processor.rb +144 -0
- data/lib/copland/errors.rb +82 -0
- data/lib/copland/event-producer.rb +95 -0
- data/lib/copland/impl/builder-factory.rb +112 -0
- data/lib/copland/impl/copland-config.yml +1 -0
- data/lib/copland/impl/include-exclude.rb +140 -0
- data/lib/copland/impl/logging-interceptor.rb +106 -0
- data/lib/copland/impl/package.yml +217 -0
- data/lib/copland/impl/startup.rb +116 -0
- data/lib/copland/impl/symbol-source-manager.rb +131 -0
- data/lib/copland/impl/symbol-source.rb +63 -0
- data/lib/copland/instantiator.rb +38 -0
- data/lib/copland/instantiator/abstract.rb +91 -0
- data/lib/copland/instantiator/complex.rb +96 -0
- data/lib/copland/instantiator/identity.rb +58 -0
- data/lib/copland/instantiator/simple.rb +68 -0
- data/lib/copland/interceptor-chain.rb +166 -0
- data/lib/copland/interceptor.rb +139 -0
- data/lib/copland/log-factory.rb +206 -0
- data/lib/copland/models.rb +39 -0
- data/lib/copland/models/abstract.rb +78 -0
- data/lib/copland/models/prototype-deferred.rb +58 -0
- data/lib/copland/models/prototype.rb +58 -0
- data/lib/copland/models/proxy.rb +100 -0
- data/lib/copland/models/singleton-deferred.rb +59 -0
- data/lib/copland/models/singleton.rb +77 -0
- data/lib/copland/models/threaded.rb +65 -0
- data/lib/copland/ordering.rb +123 -0
- data/lib/copland/package.rb +246 -0
- data/lib/copland/registry.rb +368 -0
- data/lib/copland/schema.rb +206 -0
- data/lib/copland/service-point.rb +282 -0
- data/lib/copland/utils.rb +221 -0
- data/lib/copland/version.rb +47 -0
- data/test/conf-test/list-bad-key.yml +30 -0
- data/test/conf-test/list-bad-missing.yml +28 -0
- data/test/conf-test/list-bad-type.yml +28 -0
- data/test/conf-test/list-good.yml +29 -0
- data/test/conf-test/map-bad-key.yml +25 -0
- data/test/conf-test/map-bad-missing.yml +24 -0
- data/test/conf-test/map-bad-type.yml +23 -0
- data/test/conf-test/map-good.yml +25 -0
- data/test/configuration-point/package.yml +52 -0
- data/test/configuration/yaml/config/copland-config.yml +2 -0
- data/test/configuration/yaml/config/module.yml +2 -0
- data/test/configuration/yaml/config/subdir/copland-config.yml +2 -0
- data/test/configuration/yaml/config/subdir/package.yml +4 -0
- data/test/configuration/yaml/defaults/package.yml +5 -0
- data/test/configuration/yaml/defaults/subdir/package.yml +4 -0
- data/test/configuration/yaml/tc_config-loader.rb +86 -0
- data/test/configuration/yaml/tc_configuration-point-processor.rb +134 -0
- data/test/configuration/yaml/tc_implementor-processor.rb +104 -0
- data/test/configuration/yaml/tc_interceptor-processor.rb +85 -0
- data/test/configuration/yaml/tc_listener-processor.rb +69 -0
- data/test/configuration/yaml/tc_loader.rb +74 -0
- data/test/configuration/yaml/tc_package-processor.rb +120 -0
- data/test/configuration/yaml/tc_parser.rb +94 -0
- data/test/configuration/yaml/tc_schema-parser.rb +160 -0
- data/test/configuration/yaml/tc_service-point-processor.rb +104 -0
- data/test/configuration/yaml/tc_type-validator.rb +90 -0
- data/test/custom-logger.yml +3 -0
- data/test/impl/logging/package.yml +44 -0
- data/test/impl/logging/services.rb +84 -0
- data/test/impl/startup/package.yml +46 -0
- data/test/impl/startup/services.rb +47 -0
- data/test/impl/symbols/package.yml +24 -0
- data/test/impl/symbols/services.rb +38 -0
- data/test/impl/tc_builder-factory.rb +173 -0
- data/test/impl/tc_logging-interceptor.rb +148 -0
- data/test/impl/tc_startup.rb +59 -0
- data/test/impl/tc_symbol-sources.rb +61 -0
- data/test/logger.yml +6 -0
- data/test/mock.rb +201 -0
- data/test/schema/bad-package.yml +65 -0
- data/test/schema/package.yml +102 -0
- data/test/schema/services.rb +5 -0
- data/test/services/package.yml +79 -0
- data/test/services/simple.rb +87 -0
- data/test/tc_class-factory.rb +93 -0
- data/test/tc_complex-instantiator.rb +107 -0
- data/test/tc_configuration-point-contrib.rb +74 -0
- data/test/tc_configuration-point-schema.rb +122 -0
- data/test/tc_configuration-point.rb +91 -0
- data/test/tc_default-schema-processor.rb +297 -0
- data/test/tc_identity-instantiator.rb +61 -0
- data/test/tc_interceptors.rb +84 -0
- data/test/tc_logger.rb +131 -0
- data/test/tc_models.rb +176 -0
- data/test/tc_package.rb +165 -0
- data/test/tc_proxy.rb +65 -0
- data/test/tc_registry.rb +141 -0
- data/test/tc_schema.rb +78 -0
- data/test/tc_service-point.rb +178 -0
- data/test/tc_service.rb +70 -0
- data/test/tc_simple-instantiator.rb +61 -0
- data/test/tests.rb +93 -0
- data/tutorial/01/main.rb +7 -0
- data/tutorial/01/package.yml +8 -0
- data/tutorial/01/tutorial.rb +7 -0
- data/tutorial/02/main.rb +10 -0
- data/tutorial/02/package.yml +27 -0
- data/tutorial/02/tutorial.rb +46 -0
- data/tutorial/03/main.rb +24 -0
- data/tutorial/03/package.yml +29 -0
- data/tutorial/03/tutorial.rb +48 -0
- data/tutorial/04/main.rb +24 -0
- data/tutorial/04/package.yml +35 -0
- data/tutorial/04/tutorial.rb +48 -0
- data/tutorial/05/functions/package.yml +16 -0
- data/tutorial/05/functions/services.rb +15 -0
- data/tutorial/05/main.rb +10 -0
- data/tutorial/05/package.yml +35 -0
- data/tutorial/05/tutorial.rb +53 -0
- metadata +260 -0
@@ -0,0 +1,179 @@
|
|
1
|
+
body {
|
2
|
+
background: #FFF;
|
3
|
+
font-family: sans-serif;
|
4
|
+
color: #000;
|
5
|
+
margin: 0px;
|
6
|
+
}
|
7
|
+
|
8
|
+
a {
|
9
|
+
color: #00F;
|
10
|
+
text-decoration: none;
|
11
|
+
}
|
12
|
+
|
13
|
+
a:hover {
|
14
|
+
text-decoration: underline;
|
15
|
+
}
|
16
|
+
|
17
|
+
.product-manual {
|
18
|
+
text-align: center;
|
19
|
+
font-size: x-large;
|
20
|
+
font-variant: small-caps;
|
21
|
+
font-weight: bold;
|
22
|
+
color: #005;
|
23
|
+
}
|
24
|
+
|
25
|
+
.copyright {
|
26
|
+
text-align: center;
|
27
|
+
font-size: small;
|
28
|
+
font-style: italic;
|
29
|
+
color: #005;
|
30
|
+
margin-top: 1in;
|
31
|
+
}
|
32
|
+
|
33
|
+
#banner {
|
34
|
+
background: #005;
|
35
|
+
color: #FFF;
|
36
|
+
border-bottom: 1px solid #000;
|
37
|
+
padding-top: 0.5em;
|
38
|
+
padding-bottom: 0.5em;
|
39
|
+
padding-left: 1em;
|
40
|
+
margin-bottom: 1em;
|
41
|
+
}
|
42
|
+
|
43
|
+
#banner .title {
|
44
|
+
font-size: x-large;
|
45
|
+
}
|
46
|
+
|
47
|
+
#banner .title:first-letter {
|
48
|
+
font-size: 250%;
|
49
|
+
font-weight: normal;
|
50
|
+
float: left;
|
51
|
+
margin-top: -7px;
|
52
|
+
margin-bottom: -7px;
|
53
|
+
}
|
54
|
+
|
55
|
+
#banner .product {
|
56
|
+
font-weight: bold;
|
57
|
+
color: #FF7;
|
58
|
+
letter-spacing: 0.5em;
|
59
|
+
}
|
60
|
+
|
61
|
+
#banner .tagline {
|
62
|
+
font-style: italic;
|
63
|
+
font-size: large;
|
64
|
+
color: #FFF;
|
65
|
+
}
|
66
|
+
|
67
|
+
#banner .info {
|
68
|
+
color: white;
|
69
|
+
font-size: small;
|
70
|
+
padding-right: 1em;
|
71
|
+
}
|
72
|
+
|
73
|
+
#content {
|
74
|
+
margin-left: 0cm;
|
75
|
+
margin-right: 1cm;
|
76
|
+
}
|
77
|
+
|
78
|
+
#navigation {
|
79
|
+
font-size: x-small;
|
80
|
+
border-right: 2px groove black;
|
81
|
+
border-top: 2px groove black;
|
82
|
+
margin-right: 1em;
|
83
|
+
width: 200px;
|
84
|
+
height: 100%;
|
85
|
+
background: #FFD;
|
86
|
+
}
|
87
|
+
|
88
|
+
#navigation ul, #navigation ol {
|
89
|
+
margin-left: 1.5em;
|
90
|
+
padding-left: 1.5em;
|
91
|
+
}
|
92
|
+
|
93
|
+
#navigation .license {
|
94
|
+
font-size: x-small;
|
95
|
+
text-align: center;
|
96
|
+
border-top: 1px dashed #005;
|
97
|
+
margin-top: 2em;
|
98
|
+
padding: 1em;
|
99
|
+
}
|
100
|
+
|
101
|
+
.section {
|
102
|
+
margin-bottom: 1em;
|
103
|
+
}
|
104
|
+
|
105
|
+
.section p {
|
106
|
+
text-align: justify;
|
107
|
+
}
|
108
|
+
|
109
|
+
#content pre {
|
110
|
+
background: #FFE;
|
111
|
+
border: 1px dotted #AAA;
|
112
|
+
padding: 1em;
|
113
|
+
}
|
114
|
+
|
115
|
+
#content h1 {
|
116
|
+
background: #005;
|
117
|
+
color: #FFF;
|
118
|
+
font-size: x-large;
|
119
|
+
font-weight: bold;
|
120
|
+
font-variant: small-caps;
|
121
|
+
padding: 0.5em;
|
122
|
+
border: 1px solid #000;
|
123
|
+
margin-top: 0px;
|
124
|
+
margin-bottom: 1em;
|
125
|
+
}
|
126
|
+
|
127
|
+
#content h2 {
|
128
|
+
background: #005;
|
129
|
+
color: #FFF;
|
130
|
+
font-size: large;
|
131
|
+
font-weight: bold;
|
132
|
+
font-variant: small-caps;
|
133
|
+
padding: 0.25em;
|
134
|
+
padding-left: 0.5em;
|
135
|
+
border: 1px solid #000;
|
136
|
+
margin-bottom: 1em;
|
137
|
+
}
|
138
|
+
|
139
|
+
#content h3 {
|
140
|
+
background: #FFD;
|
141
|
+
color: #000;
|
142
|
+
font-size: normal;
|
143
|
+
font-weight: bold;
|
144
|
+
font-variant: small-caps;
|
145
|
+
padding: 0.25em;
|
146
|
+
padding-left: 0.5em;
|
147
|
+
border: 1px dotted #000;
|
148
|
+
margin-bottom: 1em;
|
149
|
+
}
|
150
|
+
|
151
|
+
#navigation h1 {
|
152
|
+
margin: 0px;
|
153
|
+
padding: 1em;
|
154
|
+
color: #005;
|
155
|
+
background: transparent;
|
156
|
+
font-weight: bold;
|
157
|
+
font-size: 150%;
|
158
|
+
font-variant: small-caps;
|
159
|
+
text-align: center;
|
160
|
+
}
|
161
|
+
|
162
|
+
#navigation h2 {
|
163
|
+
margin: 0px;
|
164
|
+
margin-bottom: 1em;
|
165
|
+
padding: 0.5em;
|
166
|
+
border-top: 1px dashed #005;
|
167
|
+
border-bottom: 1px dashed #005;
|
168
|
+
color: #005;
|
169
|
+
background: transparent;
|
170
|
+
font-weight: bold;
|
171
|
+
font-size: 125%;
|
172
|
+
font-variant: small-caps;
|
173
|
+
text-align: center;
|
174
|
+
}
|
175
|
+
|
176
|
+
table.list td {
|
177
|
+
border-bottom: 1px dotted #005;
|
178
|
+
padding-bottom: 5px;
|
179
|
+
}
|
@@ -0,0 +1,407 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>Copland Manual :: Tutorial 1: Creating Services</title>
|
4
|
+
<link type="text/css" rel="stylesheet" href="manual.css" />
|
5
|
+
</head>
|
6
|
+
|
7
|
+
<body>
|
8
|
+
<div id="banner">
|
9
|
+
<table border='0' cellpadding='0' cellspacing='0' width='100%'>
|
10
|
+
<tr><td valign='top' align='left'>
|
11
|
+
<div class="title">
|
12
|
+
<span class="product">Copland—</span><br />
|
13
|
+
<span class="tagline">compose yourself...</span>
|
14
|
+
</div>
|
15
|
+
</td><td valign='middle' align='right'>
|
16
|
+
<div class="info">
|
17
|
+
Copland Version: <strong>0.8.0</strong><br />
|
18
|
+
Manual Last Updated: <strong>2004-09-27 03:37 GMT</strong>
|
19
|
+
</div>
|
20
|
+
</td></tr>
|
21
|
+
</table>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<table border='0' width='100%' cellpadding='0' cellspacing='0'>
|
25
|
+
<tr><td valign='top'>
|
26
|
+
|
27
|
+
<div id="navigation">
|
28
|
+
<h1>Copland Manual</h1>
|
29
|
+
|
30
|
+
<h2>Chapters</h2>
|
31
|
+
<ol type="I">
|
32
|
+
|
33
|
+
<li>
|
34
|
+
<a href="chapter-1.html">
|
35
|
+
Introduction
|
36
|
+
</a>
|
37
|
+
|
38
|
+
<ol type="1">
|
39
|
+
|
40
|
+
<li><a href="chapter-1.html#s1">What is Copland?</a></li>
|
41
|
+
|
42
|
+
<li><a href="chapter-1.html#s2">Features</a></li>
|
43
|
+
|
44
|
+
<li><a href="chapter-1.html#s3">Getting Copland</a></li>
|
45
|
+
|
46
|
+
<li><a href="chapter-1.html#s4">License Information</a></li>
|
47
|
+
|
48
|
+
<li><a href="chapter-1.html#s5">Support</a></li>
|
49
|
+
|
50
|
+
</ol>
|
51
|
+
</li>
|
52
|
+
|
53
|
+
<li>
|
54
|
+
<a href="chapter-2.html">
|
55
|
+
Justification
|
56
|
+
</a>
|
57
|
+
|
58
|
+
<ol type="1">
|
59
|
+
|
60
|
+
<li><a href="chapter-2.html#s1">IoC in One Paragraph</a></li>
|
61
|
+
|
62
|
+
<li><a href="chapter-2.html#s2">Why IoC?</a></li>
|
63
|
+
|
64
|
+
<li><a href="chapter-2.html#s3">A Case Study</a></li>
|
65
|
+
|
66
|
+
</ol>
|
67
|
+
</li>
|
68
|
+
|
69
|
+
<li>
|
70
|
+
<a href="chapter-3.html">
|
71
|
+
Getting Started
|
72
|
+
</a>
|
73
|
+
|
74
|
+
<ol type="1">
|
75
|
+
|
76
|
+
<li><a href="chapter-3.html#s1">Terminology</a></li>
|
77
|
+
|
78
|
+
<li><a href="chapter-3.html#s2">Quickstart</a></li>
|
79
|
+
|
80
|
+
</ol>
|
81
|
+
</li>
|
82
|
+
|
83
|
+
<li>
|
84
|
+
<a href="chapter-4.html">
|
85
|
+
Copland's Design
|
86
|
+
</a>
|
87
|
+
|
88
|
+
<ol type="1">
|
89
|
+
|
90
|
+
<li><a href="chapter-4.html#s1">HiveMind</a></li>
|
91
|
+
|
92
|
+
<li><a href="chapter-4.html#s2">Registry Initialization</a></li>
|
93
|
+
|
94
|
+
<li><a href="chapter-4.html#s3">Service Instantiation</a></li>
|
95
|
+
|
96
|
+
<li><a href="chapter-4.html#s4">Interceptor Chains</a></li>
|
97
|
+
|
98
|
+
</ol>
|
99
|
+
</li>
|
100
|
+
|
101
|
+
<li>
|
102
|
+
<a href="chapter-5.html">
|
103
|
+
Packages
|
104
|
+
</a>
|
105
|
+
|
106
|
+
<ol type="1">
|
107
|
+
|
108
|
+
<li><a href="chapter-5.html#s1">Descriptor Syntax</a></li>
|
109
|
+
|
110
|
+
<li><a href="chapter-5.html#s2">Tips</a></li>
|
111
|
+
|
112
|
+
</ol>
|
113
|
+
</li>
|
114
|
+
|
115
|
+
<li>
|
116
|
+
<a href="chapter-6.html">
|
117
|
+
Service Points
|
118
|
+
</a>
|
119
|
+
|
120
|
+
<ol type="1">
|
121
|
+
|
122
|
+
<li><a href="chapter-6.html#s1">Descriptor Syntax</a></li>
|
123
|
+
|
124
|
+
</ol>
|
125
|
+
</li>
|
126
|
+
|
127
|
+
<li>
|
128
|
+
<a href="chapter-7.html">
|
129
|
+
Service Models
|
130
|
+
</a>
|
131
|
+
|
132
|
+
<ol type="1">
|
133
|
+
|
134
|
+
<li><a href="chapter-7.html#s1">Standard Models</a></li>
|
135
|
+
|
136
|
+
<li><a href="chapter-7.html#s2">Deferred Instantiation</a></li>
|
137
|
+
|
138
|
+
<li><a href="chapter-7.html#s3">Custom Service Models</a></li>
|
139
|
+
|
140
|
+
</ol>
|
141
|
+
</li>
|
142
|
+
|
143
|
+
<li>
|
144
|
+
<a href="chapter-8.html">
|
145
|
+
Configuration Points
|
146
|
+
</a>
|
147
|
+
|
148
|
+
<ol type="1">
|
149
|
+
|
150
|
+
<li><a href="chapter-8.html#s1">Descriptor Syntax</a></li>
|
151
|
+
|
152
|
+
<li><a href="chapter-8.html#s2">DefaultSymbolSource</a></li>
|
153
|
+
|
154
|
+
</ol>
|
155
|
+
</li>
|
156
|
+
|
157
|
+
<li>
|
158
|
+
<a href="chapter-9.html">
|
159
|
+
Contributions
|
160
|
+
</a>
|
161
|
+
|
162
|
+
<ol type="1">
|
163
|
+
|
164
|
+
</ol>
|
165
|
+
</li>
|
166
|
+
|
167
|
+
<li>
|
168
|
+
<a href="chapter-10.html">
|
169
|
+
Service Factories
|
170
|
+
</a>
|
171
|
+
|
172
|
+
<ol type="1">
|
173
|
+
|
174
|
+
<li><a href="chapter-10.html#s1">Schemas</a></li>
|
175
|
+
|
176
|
+
<li><a href="chapter-10.html#s2">How do they work?</a></li>
|
177
|
+
|
178
|
+
<li><a href="chapter-10.html#s3">BuilderFactory</a></li>
|
179
|
+
|
180
|
+
</ol>
|
181
|
+
</li>
|
182
|
+
|
183
|
+
<li>
|
184
|
+
<a href="chapter-11.html">
|
185
|
+
Schemas
|
186
|
+
</a>
|
187
|
+
|
188
|
+
<ol type="1">
|
189
|
+
|
190
|
+
<li><a href="chapter-11.html#s1">Basic Format</a></li>
|
191
|
+
|
192
|
+
<li><a href="chapter-11.html#s2">Subschemas</a></li>
|
193
|
+
|
194
|
+
<li><a href="chapter-11.html#s3">Arrays</a></li>
|
195
|
+
|
196
|
+
<li><a href="chapter-11.html#s4">Named vs. Anonymous Schemas</a></li>
|
197
|
+
|
198
|
+
<li><a href="chapter-11.html#s5">Extending Schemas</a></li>
|
199
|
+
|
200
|
+
<li><a href="chapter-11.html#s6">Limitations</a></li>
|
201
|
+
|
202
|
+
</ol>
|
203
|
+
</li>
|
204
|
+
|
205
|
+
<li>
|
206
|
+
<a href="chapter-12.html">
|
207
|
+
Listeners and Event Producers
|
208
|
+
</a>
|
209
|
+
|
210
|
+
<ol type="1">
|
211
|
+
|
212
|
+
<li><a href="chapter-12.html#s1">Event Producers</a></li>
|
213
|
+
|
214
|
+
<li><a href="chapter-12.html#s2">Listeners</a></li>
|
215
|
+
|
216
|
+
<li><a href="chapter-12.html#s3">The Registry as an Event Producer</a></li>
|
217
|
+
|
218
|
+
</ol>
|
219
|
+
</li>
|
220
|
+
|
221
|
+
</ol>
|
222
|
+
|
223
|
+
<h2>API Reference</h2>
|
224
|
+
|
225
|
+
<ul>
|
226
|
+
<li><a href="http://copland.rubyforge.org/api/index.html">Copland API</a></li>
|
227
|
+
<li><a href="http://copland.rubyforge.org/packrat/index.html">Package Reference</a></li>
|
228
|
+
</ul>
|
229
|
+
|
230
|
+
<h2>Tutorials</h2>
|
231
|
+
<ol>
|
232
|
+
|
233
|
+
<li><strong>
|
234
|
+
<a href="tutorial-1.html">
|
235
|
+
Creating Services
|
236
|
+
</a>
|
237
|
+
</strong> <big>←</big><br />
|
238
|
+
<p>The basics of creating new services in Copland.</p>
|
239
|
+
</li>
|
240
|
+
|
241
|
+
<li>
|
242
|
+
<a href="tutorial-2.html">
|
243
|
+
Service Factories
|
244
|
+
</a>
|
245
|
+
<br />
|
246
|
+
<p>Introduces the concept of a “service factory”, and shows how to use them to create complex services.</p>
|
247
|
+
</li>
|
248
|
+
|
249
|
+
<li>
|
250
|
+
<a href="tutorial-3.html">
|
251
|
+
Service Models
|
252
|
+
</a>
|
253
|
+
<br />
|
254
|
+
<p>Introduces the concept of the “service model”, and shows the difference between “singleton” and “prototype”.</p>
|
255
|
+
</li>
|
256
|
+
|
257
|
+
<li>
|
258
|
+
<a href="tutorial-4.html">
|
259
|
+
Logging Interceptor
|
260
|
+
</a>
|
261
|
+
<br />
|
262
|
+
<p>Shows how to use the logging interceptor to add logging for method invocations on any service.</p>
|
263
|
+
</li>
|
264
|
+
|
265
|
+
<li>
|
266
|
+
<a href="tutorial-5.html">
|
267
|
+
Configuration Points
|
268
|
+
</a>
|
269
|
+
<br />
|
270
|
+
<p>Demonstrates the use of configuration points for decentralizing service configuration.</p>
|
271
|
+
</li>
|
272
|
+
|
273
|
+
</ol>
|
274
|
+
|
275
|
+
<p align="center"><strong>More To Come...</strong></p>
|
276
|
+
|
277
|
+
<!--
|
278
|
+
<h2>Examples</h2>
|
279
|
+
<ol>
|
280
|
+
|
281
|
+
</ol>
|
282
|
+
-->
|
283
|
+
|
284
|
+
<div class="license">
|
285
|
+
<a href="http://creativecommons.org/licenses/by-sa/2.0/"><img alt="Creative Commons License" border="0" src="http://creativecommons.org/images/public/somerights" /></a><br />
|
286
|
+
This manual is licensed under a <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons License</a>.
|
287
|
+
</div>
|
288
|
+
</div>
|
289
|
+
|
290
|
+
</td><td valign='top' width="100%">
|
291
|
+
|
292
|
+
<div id="content">
|
293
|
+
|
294
|
+
<h1>Tutorial #1. Creating Services</h1>
|
295
|
+
|
296
|
+
<p>The sources for this tutorial may be found in the <tt>tutorial/01</tt>
|
297
|
+
directory of the Copland distribution.</p>
|
298
|
+
|
299
|
+
|
300
|
+
|
301
|
+
<h2>Introduction</h2>
|
302
|
+
|
303
|
+
<p>A “service” is just an object. A plain, old, vanilla-flavored Ruby object. It’s as simple as that. You create a Ruby object, define methods and attributes on it, put it in Copland, and voila! Instant service.</p>
|
304
|
+
|
305
|
+
<p>I’m assuming you already know how to create Ruby objects. (If not, you may want to check out a more basic tutorial.) This tutorial will show you how to plug those objects into Copland, and how to access them in your program.</p>
|
306
|
+
|
307
|
+
|
308
|
+
|
309
|
+
<h2>Steps</h2>
|
310
|
+
|
311
|
+
<ol>
|
312
|
+
|
313
|
+
|
314
|
+
<li><h3>Implement the Service</h3>
|
315
|
+
|
316
|
+
<p>For this tutorial, we’ll create a service that adds two numbers and returns the result. Pretty basic, but easy to understand.</p>
|
317
|
+
|
318
|
+
<p>So, first things first: let’s write a Ruby class that performs this operation:</p>
|
319
|
+
|
320
|
+
<pre>
|
321
|
+
class Adder
|
322
|
+
|
323
|
+
def add( a, b )
|
324
|
+
a.to_f + b.to_f
|
325
|
+
end
|
326
|
+
|
327
|
+
end
|
328
|
+
</pre>
|
329
|
+
|
330
|
+
<p>(Just to give this example a little more value, we’ll have it explicitly convert its operands to floats—it makes things a little more impressive.)</p>
|
331
|
+
|
332
|
+
<p>Save your file as “tutorial.rb” and move on to the next step.<br />
|
333
|
+
</p></li>
|
334
|
+
|
335
|
+
|
336
|
+
|
337
|
+
<li><h3>Tell Copland About It</h3>
|
338
|
+
|
339
|
+
<p>Next, we need to tell Copland about our service. We’ll create a package descriptor file (called “package.yml”) in the same directory as our “tutorial.rb” file, and in it we’ll tell Copland the name of our service and what Ruby class implements it (among other things). This file is <span class="caps">YAML</span>-formatted, so if you’ve used <span class="caps">YAML</span> before, the format (at least) should look very familiar.</p>
|
340
|
+
|
341
|
+
<pre>
|
342
|
+
---
|
343
|
+
id: tutorial
|
344
|
+
description: This is the package for the Copland tutorials.
|
345
|
+
|
346
|
+
service-points:
|
347
|
+
|
348
|
+
Adder:
|
349
|
+
description: A service for adding two numbers.
|
350
|
+
implementor: tutorial/Adder
|
351
|
+
</pre>
|
352
|
+
|
353
|
+
<p>(The ‘description’ elements are always optional… we’ve shown them here just to demonstrate how they are used, but in later tutorials we’ll leave them out, for clarity.)</p>
|
354
|
+
|
355
|
+
<p>This descriptor creates a new <em>package</em>, called “tutorial”. In Copland, all services are defined within <em>packages</em>.<br />
|
356
|
+
The descriptor then defines a single <em>service point</em>, called Adder. (Service points are the definitions of services. You can think of it like this: just as an object is the instantiation of a class, so is a service the instantiation of a service point.) This service point is implemented by “tutorial/Adder”, which means that “tutorial” will be @require@d, and then “Adder” instantiated.<br />
|
357
|
+
</p></li>
|
358
|
+
|
359
|
+
|
360
|
+
|
361
|
+
<li><h3>Use the Service</h3>
|
362
|
+
|
363
|
+
<p>Lastly, we create a “main.rb” driver file which we’ll use to test our new service point. This driver will simply instantiate a registry, grab a reference to the new service, and then invoke our <code>#add</code> method:</p>
|
364
|
+
|
365
|
+
<pre>
|
366
|
+
require 'copland'
|
367
|
+
|
368
|
+
registry = Copland::Registry.build
|
369
|
+
|
370
|
+
adder = registry.service( "tutorial.Adder" )
|
371
|
+
|
372
|
+
puts adder.add( "5", 7 )
|
373
|
+
</pre>
|
374
|
+
|
375
|
+
<p>The <code>#build</code> method of Copland::Registry will recursively search for package descriptor files. By default, it will search from the current directory (but you can specify a different directory by giving it as a parameter to <code>#build</code>).</p>
|
376
|
+
|
377
|
+
<p>Once the registry has been initialized, you can query it for services. In this case, we ask the registry for the <code>tutorial.Adder</code> service (i.e., the <code>Adder</code> service that exists in the <code>tutorial</code> package). Copland then returns this service.</p>
|
378
|
+
|
379
|
+
<p>Lastly, we invoke the <code>#add</code> method and print the result. And it just works!<br />
|
380
|
+
</p></li>
|
381
|
+
|
382
|
+
|
383
|
+
</ol>
|
384
|
+
|
385
|
+
|
386
|
+
|
387
|
+
<h2>Summary</h2>
|
388
|
+
|
389
|
+
<p>This tutorial demonstrated a few things:</p>
|
390
|
+
|
391
|
+
<ol>
|
392
|
+
<li>Copland services are just plain-ol’ Ruby objects.</li>
|
393
|
+
<li>Package descriptors are just <span class="caps">YAML</span> files</li>
|
394
|
+
<li>Registry instantiation and querying services</li>
|
395
|
+
</ol>
|
396
|
+
|
397
|
+
<p>Also, this tutorial used the <em>simple</em> implementor; all it did was accept a class name (and <code>require</code> path) and instantiate it. Although this is useful for simple services, it doesn’t give us the <em>dependency injection</em> that IoC containers are famous for. The next tutorial will show how to wire several services together automatically, using the <em>complex</em> implementor.</p>
|
398
|
+
|
399
|
+
|
400
|
+
|
401
|
+
|
402
|
+
</div>
|
403
|
+
|
404
|
+
</td></tr>
|
405
|
+
</table>
|
406
|
+
</body>
|
407
|
+
</html>
|