ad-framework 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 (64) hide show
  1. data/.gitignore +6 -0
  2. data/Gemfile +12 -0
  3. data/README.markdown +36 -0
  4. data/Rakefile +19 -0
  5. data/ad-framework.gemspec +25 -0
  6. data/doc/open_ldap_server.markdown +17 -0
  7. data/extras/adtest.schema +304 -0
  8. data/extras/slapd.conf +10 -0
  9. data/lib/ad-framework.rb +53 -0
  10. data/lib/ad-framework/attribute.rb +35 -0
  11. data/lib/ad-framework/attribute_type.rb +133 -0
  12. data/lib/ad-framework/auxiliary_class.rb +24 -0
  13. data/lib/ad-framework/config.rb +72 -0
  14. data/lib/ad-framework/config/attribute_definition.rb +18 -0
  15. data/lib/ad-framework/config/mapping.rb +26 -0
  16. data/lib/ad-framework/exceptions.rb +17 -0
  17. data/lib/ad-framework/fields.rb +44 -0
  18. data/lib/ad-framework/patterns/callbacks.rb +47 -0
  19. data/lib/ad-framework/patterns/has_schema.rb +127 -0
  20. data/lib/ad-framework/patterns/persistence.rb +67 -0
  21. data/lib/ad-framework/patterns/searchable.rb +117 -0
  22. data/lib/ad-framework/patterns/validations.rb +50 -0
  23. data/lib/ad-framework/schema.rb +118 -0
  24. data/lib/ad-framework/structural_class.rb +61 -0
  25. data/lib/ad-framework/utilities/entry_builder.rb +77 -0
  26. data/lib/ad-framework/utilities/transaction.rb +32 -0
  27. data/lib/ad-framework/utilities/validator.rb +26 -0
  28. data/lib/ad-framework/version.rb +5 -0
  29. data/test/helper.rb +71 -0
  30. data/test/integration/defined_array_test.rb +49 -0
  31. data/test/integration/defined_integer_test.rb +48 -0
  32. data/test/integration/defined_string_test.rb +48 -0
  33. data/test/integration/defined_top_test.rb +101 -0
  34. data/test/integration/defined_user_test.rb +140 -0
  35. data/test/irb.rb +2 -0
  36. data/test/support/factory.rb +67 -0
  37. data/test/support/ldap.yml +6 -0
  38. data/test/support/schema/attribute_types.rb +67 -0
  39. data/test/support/schema/attributes.rb +10 -0
  40. data/test/support/schema/auxiliary_classes.rb +12 -0
  41. data/test/support/schema/structural_classes.rb +46 -0
  42. data/test/support/seed.rb +28 -0
  43. data/test/support/state.rb +29 -0
  44. data/test/unit/ad-framework/attribute_test.rb +84 -0
  45. data/test/unit/ad-framework/attribute_type/class_methods_test.rb +146 -0
  46. data/test/unit/ad-framework/attribute_type_test.rb +114 -0
  47. data/test/unit/ad-framework/auxiliary_class_test.rb +39 -0
  48. data/test/unit/ad-framework/config/attribute_definition_test.rb +26 -0
  49. data/test/unit/ad-framework/config/mapping_test.rb +41 -0
  50. data/test/unit/ad-framework/config_test.rb +121 -0
  51. data/test/unit/ad-framework/fields_test.rb +44 -0
  52. data/test/unit/ad-framework/patterns/callbacks_test.rb +90 -0
  53. data/test/unit/ad-framework/patterns/has_schema/class_methods_test.rb +214 -0
  54. data/test/unit/ad-framework/patterns/has_schema_test.rb +96 -0
  55. data/test/unit/ad-framework/patterns/persistence_test.rb +126 -0
  56. data/test/unit/ad-framework/patterns/searchable_test.rb +201 -0
  57. data/test/unit/ad-framework/patterns/validations_test.rb +113 -0
  58. data/test/unit/ad-framework/schema_test.rb +268 -0
  59. data/test/unit/ad-framework/structural_class_test.rb +64 -0
  60. data/test/unit/ad-framework/utilities/entry_builder_test.rb +107 -0
  61. data/test/unit/ad-framework/utilities/transaction_test.rb +50 -0
  62. data/test/unit/ad-framework/utilities/validator_test.rb +46 -0
  63. data/test/unit/ad-framework_test.rb +116 -0
  64. metadata +225 -0
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ log/*
6
+ coverage/*
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in ad-framework.gemspec
4
+ gemspec
5
+
6
+ gem 'rake', "~>0.9.2"
7
+
8
+ if RUBY_VERSION =~ /^1.8/
9
+ gem 'rcov'
10
+ else
11
+ gem 'simplecov', :require => false
12
+ end
@@ -0,0 +1,36 @@
1
+ # AD::Framework
2
+
3
+ A framework for defining an ActiveDirectory schema in ruby.
4
+
5
+ ## Description
6
+
7
+ AD::Framework is a basis for defining an Active Directory schema in ruby. It provides all the building blocks needed to access and modify Active Directory data.
8
+
9
+ ## Installation
10
+
11
+ gem install ad-framework
12
+
13
+ ## License
14
+
15
+ Copyright (c) 2011 Collin Redding and Team Insight
16
+
17
+ Permission is hereby granted, free of charge, to any person
18
+ obtaining a copy of this software and associated documentation
19
+ files (the "Software"), to deal in the Software without
20
+ restriction, including without limitation the rights to use,
21
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
22
+ copies of the Software, and to permit persons to whom the
23
+ Software is furnished to do so, subject to the following
24
+ conditions:
25
+
26
+ The above copyright notice and this permission notice shall be
27
+ included in all copies or substantial portions of the Software.
28
+
29
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
31
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
32
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
33
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
34
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
35
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
36
+ OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,19 @@
1
+ require 'assert/rake_tasks'
2
+ include Assert::RakeTasks
3
+
4
+ require 'bundler'
5
+ Bundler::GemHelper.install_tasks
6
+
7
+ if RUBY_VERSION =~ /^1.8/
8
+ require 'rcov/rcovtask'
9
+ Rcov::RcovTask.new('coverage') do |t|
10
+ t.test_files = FileList['test/**/*_test.rb']
11
+ t.rcov_opts << "--no-html"
12
+ t.verbose = true
13
+ end
14
+ else
15
+ task :coverage do
16
+ ENV['COVERAGE'] = "true"
17
+ Rake::Task['test'].execute
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "ad-framework/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "ad-framework"
7
+ s.version = Ad::Framework::VERSION
8
+ s.authors = ["Collin Redding", "Matt McPherson"]
9
+ s.homepage = "http://github.com/teaminsight/ad-framework"
10
+ s.summary = %q{A framework for defining an ActiveDirectory schema in ruby.}
11
+ s.description = %q{A framework for defining an ActiveDirectory schema in ruby.}
12
+
13
+ s.rubyforge_project = "ad-framework"
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_runtime_dependency "ad-ldap", "~>0.1.1"
21
+
22
+ s.add_development_dependency "assert", "~>0.3.0"
23
+ s.add_development_dependency "log4r", "~>1.1.9"
24
+ s.add_development_dependency "mocha", "~>0.9.12"
25
+ end
@@ -0,0 +1,17 @@
1
+ # OpenLDAP server
2
+
3
+ TODO - explanation of why this is needed for testing
4
+
5
+ ## Installation
6
+
7
+ TODO
8
+
9
+ ## Configuration
10
+
11
+ TODO
12
+
13
+ ## Running
14
+
15
+ ```
16
+ sudo /usr/local/libexec/slapd -d 255
17
+ ```
@@ -0,0 +1,304 @@
1
+ # Attribute Types #############################################################
2
+
3
+ attributetype ( 1.2.840.113556.1.4.159
4
+ NAME 'accountExpires'
5
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
6
+ SINGLE-VALUE )
7
+
8
+ attributetype ( 1.2.840.113556.1.4.1307
9
+ NAME 'accountNameHistory'
10
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )
11
+
12
+ attributetype ( 1.2.840.113556.1.4.150
13
+ NAME 'adminCount'
14
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
15
+ SINGLE-VALUE )
16
+
17
+ attributetype ( 1.2.840.113556.1.2.226
18
+ NAME 'adminDescription'
19
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
20
+ SINGLE-VALUE )
21
+
22
+ attributetype ( 1.2.840.113556.1.2.194
23
+ NAME 'adminDisplayName'
24
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
25
+ SINGLE-VALUE )
26
+
27
+ attributetype ( 1.2.840.113556.1.4.652
28
+ NAME 'assistant'
29
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.12'
30
+ SINGLE-VALUE )
31
+
32
+ attributetype ( 1.2.840.113556.1.4.49
33
+ NAME 'badPasswordTime'
34
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
35
+ SINGLE-VALUE )
36
+
37
+ attributetype ( 1.2.840.113556.1.4.12
38
+ NAME 'badPwdCount'
39
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
40
+ SINGLE-VALUE )
41
+
42
+ attributetype ( 1.2.840.113556.1.4.916
43
+ NAME 'canonicalName'
44
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )
45
+
46
+ attributetype ( 1.2.840.113556.1.4.156
47
+ NAME 'comment'
48
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
49
+ SINGLE-VALUE )
50
+
51
+ attributetype ( 1.2.840.113556.1.2.146
52
+ NAME 'company'
53
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
54
+ SINGLE-VALUE )
55
+
56
+ attributetype ( 1.2.840.113556.1.4.25
57
+ NAME 'countryCode'
58
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
59
+ SINGLE-VALUE )
60
+
61
+ attributetype ( 1.2.840.113556.1.2.141
62
+ NAME 'department'
63
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
64
+ SINGLE-VALUE )
65
+
66
+ attributetype ( 1.2.840.113556.1.4.261
67
+ NAME 'division'
68
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
69
+ SINGLE-VALUE )
70
+
71
+ attributetype ( 1.2.840.113556.1.4.35
72
+ NAME 'employeeID'
73
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
74
+ SINGLE-VALUE )
75
+
76
+ attributetype ( 1.2.840.113556.1.4.44
77
+ NAME 'homeDirectory'
78
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
79
+ SINGLE-VALUE )
80
+
81
+ attributetype ( 1.2.840.113556.1.4.45
82
+ NAME 'homeDrive'
83
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
84
+ SINGLE-VALUE )
85
+
86
+ attributetype ( 1.2.840.113556.1.4.721
87
+ NAME 'ipPhone'
88
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
89
+ SINGLE-VALUE )
90
+
91
+ attributetype ( 1.2.840.113556.1.4.52
92
+ NAME 'lastLogon'
93
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
94
+ SINGLE-VALUE )
95
+
96
+ attributetype ( 1.2.840.113556.1.4.662
97
+ NAME 'lockoutTime'
98
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
99
+ SINGLE-VALUE )
100
+
101
+ attributetype ( 1.2.840.113556.1.4.169
102
+ NAME 'logonCount'
103
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
104
+ SINGLE-VALUE )
105
+
106
+ attributetype ( 1.2.840.113556.1.4.76
107
+ NAME 'maxStorage'
108
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
109
+ SINGLE-VALUE )
110
+
111
+ attributetype ( 634.2.1
112
+ NAME 'middleName'
113
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
114
+ SINGLE-VALUE )
115
+
116
+ attributetype ( 1.2.840.113556.1.4.146
117
+ NAME 'objectSid'
118
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.40'
119
+ SINGLE-VALUE )
120
+
121
+ attributetype ( 1.2.840.113556.1.4.144
122
+ NAME 'operatorCount'
123
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
124
+ SINGLE-VALUE )
125
+
126
+ attributetype ( 1.2.840.113556.1.2.277
127
+ NAME 'otherHomePhone'
128
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )
129
+
130
+ attributetype ( 1.2.840.113556.1.4.722
131
+ NAME 'otherIpPhone'
132
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )
133
+
134
+ attributetype ( 1.2.840.113556.1.4.647
135
+ NAME 'otherMobile'
136
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )
137
+
138
+ attributetype ( 1.2.840.113556.1.2.18
139
+ NAME 'otherTelephone'
140
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )
141
+
142
+ attributetype ( 1.2.840.113556.1.2.118
143
+ NAME 'otherPager'
144
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )
145
+
146
+ attributetype ( 1.2.840.113556.1.4.139
147
+ NAME 'profilePath'
148
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
149
+ SINGLE-VALUE )
150
+
151
+ attributetype ( 1.2.840.113556.1.2.210
152
+ NAME 'proxyAddresses'
153
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )
154
+
155
+ attributetype ( 1.2.840.113556.1.4.96
156
+ NAME 'pwdLastSet'
157
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
158
+ SINGLE-VALUE )
159
+
160
+ attributetype ( 1.2.840.113556.1.4.153
161
+ NAME 'rid'
162
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
163
+ SINGLE-VALUE )
164
+
165
+ attributetype ( 1.2.840.113556.1.4.221
166
+ NAME 'sAMAccountName'
167
+ EQUALITY caseIgnoreMatch
168
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
169
+ SINGLE-VALUE )
170
+
171
+ attributetype ( 1.2.840.113556.1.4.302
172
+ NAME 'sAMAccountType'
173
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
174
+ SINGLE-VALUE )
175
+
176
+ attributetype ( 1.2.840.113556.1.4.121
177
+ NAME 'securityIdentifier'
178
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.40'
179
+ SINGLE-VALUE )
180
+
181
+ attributetype ( 1.2.840.113556.1.4.771
182
+ NAME 'servicePrincipalName'
183
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )
184
+
185
+ attributetype ( 1.2.840.113556.1.4.609
186
+ NAME 'sIDHistory'
187
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )
188
+
189
+ attributetype ( 1.2.840.113556.1.4.375
190
+ NAME 'systemFlags'
191
+ EQUALITY integerMatch
192
+ ORDERING integerOrderingMatch
193
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
194
+ SINGLE-VALUE )
195
+
196
+ attributetype ( 1.2.840.113556.1.4.1301
197
+ NAME 'tokenGroups'
198
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )
199
+
200
+ attributetype ( 1.2.840.113556.1.4.1418
201
+ NAME 'tokenGroupsGlobalAndUniversal'
202
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )
203
+
204
+ attributetype ( 1.2.840.113556.1.4.1303
205
+ NAME 'tokenGroupsNoGCAcceptable'
206
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )
207
+
208
+ attributetype ( 1.2.840.113556.1.4.90
209
+ NAME 'unicodePwd'
210
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.40'
211
+ SINGLE-VALUE )
212
+
213
+ attributetype ( 1.2.840.113556.1.4.8
214
+ NAME 'userAccountControl'
215
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.27'
216
+ SINGLE-VALUE )
217
+
218
+ attributetype ( 1.2.840.113556.1.4.138
219
+ NAME 'userParameters'
220
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
221
+ SINGLE-VALUE )
222
+
223
+ attributetype ( 1.2.840.113556.1.4.656
224
+ NAME 'userPrincipalName'
225
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
226
+ SINGLE-VALUE )
227
+
228
+ attributetype ( 1.2.840.113556.1.2.3
229
+ NAME 'whenChanged'
230
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.24'
231
+ SINGLE-VALUE )
232
+
233
+ attributetype ( 1.2.840.113556.1.2.2
234
+ NAME 'whenCreated'
235
+ SYNTAX '1.3.6.1.4.1.1466.115.121.1.24'
236
+ SINGLE-VALUE )
237
+
238
+ ###############################################################################
239
+
240
+ # Object Classes ##############################################################
241
+
242
+ objectclass ( 634.1.1
243
+ NAME 'adtest-top'
244
+ ABSTRACT
245
+ MUST ( objectClass )
246
+ MAY (
247
+ cn $ description $ distinguishedName $ whenCreated $ whenChanged $ displayName $
248
+ adminDisplayName $ proxyAddresses $ adminDescription $ systemFlags $ canonicalName
249
+ )
250
+ )
251
+
252
+ objectclass ( 634.1.2
253
+ NAME 'adtest-container'
254
+ SUP adtest-top
255
+ STRUCTURAL
256
+ MUST ( cn )
257
+ )
258
+
259
+ objectclass ( 634.1.3
260
+ NAME 'adtest-person'
261
+ SUP adtest-top
262
+ ABSTRACT
263
+ MUST ( cn )
264
+ MAY ( sn $ telephoneNumber $ userPassword )
265
+ )
266
+
267
+ objectclass ( 634.1.4
268
+ NAME 'adtest-organizationalPerson'
269
+ SUP adtest-person
270
+ ABSTRACT
271
+ MAY (
272
+ streetAddress $ homePostalAddress $ assistant $ company $ countryCode $ c $ department $
273
+ division $ mail $ employeeID $ facsimileTelephoneNumber $ generationQualifier $ givenName $
274
+ houseIdentifier $ initials $ l $ manager $ ou $ o $ otherMailbox $ middleName $ personalTitle $
275
+ otherHomePhone $ homePhone $ otherIpPhone $ ipPhone $ otherMobile $ mobile $ otherTelephone $
276
+ otherPager $ pager $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $
277
+ st $ street $ co $ title $ comment
278
+ )
279
+ )
280
+
281
+ objectclass ( 634.1.5
282
+ NAME 'adtest-user'
283
+ SUP adtest-organizationalPerson
284
+ STRUCTURAL
285
+ MAY (
286
+ accountExpires $ adminCount $ badPasswordTime $ badPwdCount $ mail $ employeeNumber $
287
+ employeeType $ givenName $ homeDirectory $ homeDrive $ initials $ lastLogon $ lockoutTime $
288
+ logonCount $ maxStorage $ operatorCount $ profilePath $ pwdLastSet $ roomNumber $
289
+ servicePrincipalName $ unicodePwd $ userAccountControl $ userParameters $ userPrincipalName
290
+ )
291
+ )
292
+
293
+ objectclass ( 634.1.6
294
+ NAME 'adtest-securityPrincipal'
295
+ SUP adtest-top
296
+ AUXILIARY
297
+ MUST ( objectSid $ sAMAccountName )
298
+ MAY (
299
+ accountNameHistory $ sAMAccountType $ rid $ securityIdentifier $ sIDHistory $ tokenGroups $
300
+ tokenGroupsGlobalAndUniversal $ tokenGroupsNoGCAcceptable
301
+ )
302
+ )
303
+
304
+ ###############################################################################
@@ -0,0 +1,10 @@
1
+ include /usr/local/etc/openldap/schema/core.schema
2
+ include /usr/local/etc/openldap/schema/cosine.schema
3
+ include /usr/local/etc/openldap/schema/inetorgperson.schema
4
+ include /usr/local/etc/openldap/schema/adtest.schema
5
+
6
+ database bdb
7
+ suffix "dc=localhost"
8
+ rootdn "cn=root,dc=localhost"
9
+ rootpw secret
10
+ directory /usr/local/var/openldap-data
@@ -0,0 +1,53 @@
1
+ require 'ad-framework/config'
2
+ require 'ad-framework/attribute_type'
3
+ require 'ad-framework/auxiliary_class'
4
+ require 'ad-framework/structural_class'
5
+
6
+ module AD
7
+ module Framework
8
+ class << self
9
+
10
+ def configure
11
+ if block_given?
12
+ yield self.config
13
+ end
14
+ self.config
15
+ end
16
+
17
+ def config
18
+ @config ||= AD::Framework::Config.new
19
+ end
20
+
21
+ def connection
22
+ self.config.adapter
23
+ end
24
+
25
+ def defined_attributes
26
+ self.config.attributes
27
+ end
28
+ def register_attributes(attributes)
29
+ attributes.each do |attribute|
30
+ self.config.add_attribute(attribute)
31
+ end
32
+ end
33
+
34
+ def defined_attribute_types
35
+ self.config.attribute_types
36
+ end
37
+ def register_attribute_type(attribute_type)
38
+ self.config.add_attribute_type(attribute_type)
39
+ end
40
+
41
+ def defined_object_classes
42
+ self.config.object_classes
43
+ end
44
+ def register_structural_class(structural_class)
45
+ self.config.add_object_class(structural_class)
46
+ end
47
+ def register_auxiliary_class(auxiliary_class)
48
+ self.config.add_object_class(auxiliary_class)
49
+ end
50
+
51
+ end
52
+ end
53
+ end