ad-framework 0.1.0

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