whois 1.0.12 → 1.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 (50) hide show
  1. data/CHANGELOG.rdoc +16 -1
  2. data/Manifest +24 -4
  3. data/lib/whois.rb +5 -5
  4. data/lib/whois/answer.rb +6 -2
  5. data/lib/whois/answer/contact.rb +18 -17
  6. data/lib/whois/answer/parser.rb +16 -1
  7. data/lib/whois/answer/parser/base.rb +40 -4
  8. data/lib/whois/answer/parser/whois.ausregistry.net.au.rb +71 -0
  9. data/lib/whois/answer/parser/whois.denic.de.rb +6 -6
  10. data/lib/whois/answer/parser/whois.nic.ac.rb +3 -3
  11. data/lib/whois/answer/parser/whois.nic.am.rb +83 -0
  12. data/lib/whois/answer/parser/whois.nic.as.rb +73 -0
  13. data/lib/whois/answer/parser/whois.nic.hu.rb +7 -7
  14. data/lib/whois/answer/parser/whois.nic.it.rb +6 -6
  15. data/lib/whois/answer/parser/whois.nic.st.rb +81 -0
  16. data/lib/whois/answer/parser/whois.publicinterestregistry.net.rb +3 -3
  17. data/lib/whois/version.rb +2 -2
  18. data/test/answer/contact_test.rb +14 -0
  19. data/test/answer/parser/base_test.rb +18 -0
  20. data/test/answer/parser/whois.ausregistry.net.au_test.rb +70 -0
  21. data/test/answer/parser/whois.denic.de_test.rb +65 -44
  22. data/test/answer/parser/whois.eu_test.rb +1 -1
  23. data/test/answer/parser/whois.nic-se.se_test.rb +1 -1
  24. data/test/answer/parser/whois.nic.ac_test.rb +13 -13
  25. data/test/answer/parser/whois.nic.am_test.rb +84 -0
  26. data/test/answer/parser/whois.nic.as_test.rb +63 -0
  27. data/test/answer/parser/whois.nic.hu_test.rb +45 -35
  28. data/test/answer/parser/whois.nic.it_test.rb +92 -65
  29. data/test/answer/parser/whois.nic.st_test.rb +77 -0
  30. data/test/answer/parser/whois.publicinterestregistry.net_test.rb +26 -20
  31. data/test/answer/parser_test.rb +45 -0
  32. data/test/answer_test.rb +7 -0
  33. data/test/list_tld +4 -4
  34. data/test/testcases/responses/whois.ausregistry.net.au/available.txt +1 -0
  35. data/test/testcases/responses/whois.ausregistry.net.au/registered.txt +23 -0
  36. data/test/testcases/responses/whois.denic.de/{nameservers_with_ip.txt → property_nameservers_with_ip.txt} +0 -0
  37. data/test/testcases/responses/whois.denic.de/property_technical_contact.txt +70 -0
  38. data/test/testcases/responses/whois.eu/{nameservers_with_ip.txt → property_nameservers_with_ip.txt} +0 -0
  39. data/test/testcases/responses/whois.nic-se.se/{nameservers_with_ip.txt → property_nameservers_with_ip.txt} +0 -0
  40. data/test/testcases/responses/whois.nic.am/available.txt +3 -0
  41. data/test/testcases/responses/whois.nic.am/registered.txt +42 -0
  42. data/test/testcases/responses/whois.nic.as/available.txt +12 -0
  43. data/test/testcases/responses/whois.nic.as/registered.txt +18 -0
  44. data/test/testcases/responses/whois.nic.it/property_admin_contact.txt +53 -0
  45. data/test/testcases/responses/whois.nic.it/{contact.txt → property_registrant_contact.txt} +0 -0
  46. data/test/testcases/responses/whois.nic.it/property_technical_contact.txt +53 -0
  47. data/test/testcases/responses/whois.nic.st/available.txt +1 -0
  48. data/test/testcases/responses/whois.nic.st/registered.txt +47 -0
  49. data/whois.gemspec +5 -5
  50. metadata +36 -7
data/CHANGELOG.rdoc CHANGED
@@ -1,7 +1,22 @@
1
1
  = Changelog
2
2
 
3
3
 
4
- == master
4
+ == Release 1.1.0
5
+
6
+ * NEW: Added simple .am TLD parser (whois.nic.am).
7
+
8
+ * NEW: Added simple .as TLD parser (whois.nic.as).
9
+
10
+ * NEW: Added simple .au TLD parser (whois.ausregistry.net.au).
11
+
12
+ * NEW: Added simple .st TLD parser (whois.nic.st).
13
+
14
+ * NEW: New methods Whois::Answer#contacts, Whois::Answer::Parser#contacts, and Whois::Answer::Parser::Base#contacts returns all supported contacts.
15
+
16
+ * CHANGED: Renamed Whois::Answer::Parser::Base#(admin|technical|registrant) to Whois::Answer::Parser::Base#(admin|technical|registrant)_contact.
17
+
18
+
19
+ == Release 1.0.12
5
20
 
6
21
  * NEW: Added simple .in TLD parser (whois.registry.in).
7
22
 
data/Manifest CHANGED
@@ -30,6 +30,7 @@ lib/whois/answer/parser/whois.afilias-grs.info.rb
30
30
  lib/whois/answer/parser/whois.afilias.info.rb
31
31
  lib/whois/answer/parser/whois.ai.rb
32
32
  lib/whois/answer/parser/whois.arnes.si.rb
33
+ lib/whois/answer/parser/whois.ausregistry.net.au.rb
33
34
  lib/whois/answer/parser/whois.biz.rb
34
35
  lib/whois/answer/parser/whois.cat.rb
35
36
  lib/whois/answer/parser/whois.cira.ca.rb
@@ -57,6 +58,8 @@ lib/whois/answer/parser/whois.nic-se.se.rb
57
58
  lib/whois/answer/parser/whois.nic.ac.rb
58
59
  lib/whois/answer/parser/whois.nic.af.rb
59
60
  lib/whois/answer/parser/whois.nic.ag.rb
61
+ lib/whois/answer/parser/whois.nic.am.rb
62
+ lib/whois/answer/parser/whois.nic.as.rb
60
63
  lib/whois/answer/parser/whois.nic.asia.rb
61
64
  lib/whois/answer/parser/whois.nic.at.rb
62
65
  lib/whois/answer/parser/whois.nic.cc.rb
@@ -77,6 +80,7 @@ lib/whois/answer/parser/whois.nic.mx.rb
77
80
  lib/whois/answer/parser/whois.nic.name.rb
78
81
  lib/whois/answer/parser/whois.nic.nu.rb
79
82
  lib/whois/answer/parser/whois.nic.or.kr.rb
83
+ lib/whois/answer/parser/whois.nic.st.rb
80
84
  lib/whois/answer/parser/whois.nic.tel.rb
81
85
  lib/whois/answer/parser/whois.nic.tl.rb
82
86
  lib/whois/answer/parser/whois.nic.travel.rb
@@ -120,6 +124,7 @@ lib/whois/server/adapters/verisign.rb
120
124
  lib/whois/server/adapters/web.rb
121
125
  lib/whois/version.rb
122
126
  tasks/server.rake
127
+ test/answer/contact_test.rb
123
128
  test/answer/parser/base_test.rb
124
129
  test/answer/parser/blank_test.rb
125
130
  test/answer/parser/jobswhois.verisign-grs.com_test.rb
@@ -130,6 +135,7 @@ test/answer/parser/whois.afilias-grs.info_test.rb
130
135
  test/answer/parser/whois.afilias.info_test.rb
131
136
  test/answer/parser/whois.ai_test.rb
132
137
  test/answer/parser/whois.arnes.si_test.rb
138
+ test/answer/parser/whois.ausregistry.net.au_test.rb
133
139
  test/answer/parser/whois.biz_test.rb
134
140
  test/answer/parser/whois.cat_test.rb
135
141
  test/answer/parser/whois.cira.ca_test.rb
@@ -157,6 +163,8 @@ test/answer/parser/whois.nic-se.se_test.rb
157
163
  test/answer/parser/whois.nic.ac_test.rb
158
164
  test/answer/parser/whois.nic.af_test.rb
159
165
  test/answer/parser/whois.nic.ag_test.rb
166
+ test/answer/parser/whois.nic.am_test.rb
167
+ test/answer/parser/whois.nic.as_test.rb
160
168
  test/answer/parser/whois.nic.asia_test.rb
161
169
  test/answer/parser/whois.nic.at_test.rb
162
170
  test/answer/parser/whois.nic.cc_test.rb
@@ -177,6 +185,7 @@ test/answer/parser/whois.nic.mx_test.rb
177
185
  test/answer/parser/whois.nic.name_test.rb
178
186
  test/answer/parser/whois.nic.nu_test.rb
179
187
  test/answer/parser/whois.nic.or.kr_test.rb
188
+ test/answer/parser/whois.nic.st_test.rb
180
189
  test/answer/parser/whois.nic.tel_test.rb
181
190
  test/answer/parser/whois.nic.tl_test.rb
182
191
  test/answer/parser/whois.nic.travel_test.rb
@@ -256,6 +265,8 @@ test/testcases/responses/whois.ai/available.txt
256
265
  test/testcases/responses/whois.ai/registered.txt
257
266
  test/testcases/responses/whois.arnes.si/available.txt
258
267
  test/testcases/responses/whois.arnes.si/registered.txt
268
+ test/testcases/responses/whois.ausregistry.net.au/available.txt
269
+ test/testcases/responses/whois.ausregistry.net.au/registered.txt
259
270
  test/testcases/responses/whois.biz/available.txt
260
271
  test/testcases/responses/whois.biz/registered.txt
261
272
  test/testcases/responses/whois.cat/available.txt
@@ -272,7 +283,8 @@ test/testcases/responses/whois.denic.de/1-10-0_available.txt
272
283
  test/testcases/responses/whois.denic.de/1-10-0_registered.txt
273
284
  test/testcases/responses/whois.denic.de/available.txt
274
285
  test/testcases/responses/whois.denic.de/error_invalid_domain_name.txt
275
- test/testcases/responses/whois.denic.de/nameservers_with_ip.txt
286
+ test/testcases/responses/whois.denic.de/property_nameservers_with_ip.txt
287
+ test/testcases/responses/whois.denic.de/property_technical_contact.txt
276
288
  test/testcases/responses/whois.denic.de/registered.txt
277
289
  test/testcases/responses/whois.dk-hostmaster.dk/available.txt
278
290
  test/testcases/responses/whois.dk-hostmaster.dk/registered.txt
@@ -295,7 +307,7 @@ test/testcases/responses/whois.educause.edu/registered.txt
295
307
  test/testcases/responses/whois.eu.org/available.txt
296
308
  test/testcases/responses/whois.eu.org/registered.txt
297
309
  test/testcases/responses/whois.eu/available.txt
298
- test/testcases/responses/whois.eu/nameservers_with_ip.txt
310
+ test/testcases/responses/whois.eu/property_nameservers_with_ip.txt
299
311
  test/testcases/responses/whois.eu/registered.txt
300
312
  test/testcases/responses/whois.hkdnr.net.hk/available.txt
301
313
  test/testcases/responses/whois.hkdnr.net.hk/registered.txt
@@ -311,7 +323,7 @@ test/testcases/responses/whois.meregistry.net/registered.txt
311
323
  test/testcases/responses/whois.museum/available.txt
312
324
  test/testcases/responses/whois.museum/registered.txt
313
325
  test/testcases/responses/whois.nic-se.se/available.txt
314
- test/testcases/responses/whois.nic-se.se/nameservers_with_ip.txt
326
+ test/testcases/responses/whois.nic-se.se/property_nameservers_with_ip.txt
315
327
  test/testcases/responses/whois.nic-se.se/registered.txt
316
328
  test/testcases/responses/whois.nic.ac/available.txt
317
329
  test/testcases/responses/whois.nic.ac/registered.txt
@@ -319,6 +331,10 @@ test/testcases/responses/whois.nic.af/available.txt
319
331
  test/testcases/responses/whois.nic.af/registered.txt
320
332
  test/testcases/responses/whois.nic.ag/available.txt
321
333
  test/testcases/responses/whois.nic.ag/registered.txt
334
+ test/testcases/responses/whois.nic.am/available.txt
335
+ test/testcases/responses/whois.nic.am/registered.txt
336
+ test/testcases/responses/whois.nic.as/available.txt
337
+ test/testcases/responses/whois.nic.as/registered.txt
322
338
  test/testcases/responses/whois.nic.asia/available.txt
323
339
  test/testcases/responses/whois.nic.asia/registered.txt
324
340
  test/testcases/responses/whois.nic.at/available.txt
@@ -357,7 +373,9 @@ test/testcases/responses/whois.nic.im/registered.txt
357
373
  test/testcases/responses/whois.nic.io/available.txt
358
374
  test/testcases/responses/whois.nic.io/registered.txt
359
375
  test/testcases/responses/whois.nic.it/available.txt
360
- test/testcases/responses/whois.nic.it/contact.txt
376
+ test/testcases/responses/whois.nic.it/property_admin_contact.txt
377
+ test/testcases/responses/whois.nic.it/property_registrant_contact.txt
378
+ test/testcases/responses/whois.nic.it/property_technical_contact.txt
361
379
  test/testcases/responses/whois.nic.it/registered.txt
362
380
  test/testcases/responses/whois.nic.it/status_active.txt
363
381
  test/testcases/responses/whois.nic.it/status_available.txt
@@ -378,6 +396,8 @@ test/testcases/responses/whois.nic.nu/available.txt
378
396
  test/testcases/responses/whois.nic.nu/registered.txt
379
397
  test/testcases/responses/whois.nic.or.kr/available.txt
380
398
  test/testcases/responses/whois.nic.or.kr/registered.txt
399
+ test/testcases/responses/whois.nic.st/available.txt
400
+ test/testcases/responses/whois.nic.st/registered.txt
381
401
  test/testcases/responses/whois.nic.tel/available.txt
382
402
  test/testcases/responses/whois.nic.tel/registered.txt
383
403
  test/testcases/responses/whois.nic.tl/available.txt
data/lib/whois.rb CHANGED
@@ -63,8 +63,8 @@ module Whois
63
63
  def self.available?(qstring)
64
64
  query(qstring).available?
65
65
  rescue ParserNotFound => e
66
- $stderr.puts "This method is not supported for this kind of object.\n" +
67
- "Use Whois.query('#{qstring}') instead."
66
+ warn "This method is not supported for this kind of object.\n" +
67
+ "Use Whois.query('#{qstring}') instead."
68
68
  nil
69
69
  end
70
70
 
@@ -87,8 +87,8 @@ module Whois
87
87
  def self.registered?(qstring)
88
88
  query(qstring).registered?
89
89
  rescue ParserNotFound => e
90
- $stderr.puts "This method is not supported for this kind of object.\n" +
91
- "Use Whois.query('#{qstring}') instead."
90
+ warn "This method is not supported for this kind of object.\n" +
91
+ "Use Whois.query('#{qstring}') instead."
92
92
  nil
93
93
  end
94
94
 
@@ -101,7 +101,7 @@ module Whois
101
101
 
102
102
  def self.deprecate(message = nil)
103
103
  message ||= "You are using deprecated behavior which will be removed from the next major or minor release."
104
- $stderr.puts("DEPRECATION WARNING: #{message}")
104
+ warn("DEPRECATION WARNING: #{message}")
105
105
  end
106
106
 
107
107
  end
data/lib/whois/answer.rb CHANGED
@@ -82,6 +82,7 @@ module Whois
82
82
  @content ||= parts.map(&:response).join("\n")
83
83
  end
84
84
 
85
+
85
86
  # Returns whether this answer changed compared to <tt>other</tt>.
86
87
  #
87
88
  # Comparing the Answer contents is not always as trivial as it seems.
@@ -102,6 +103,9 @@ module Whois
102
103
  parser.unchanged?(other.parser)
103
104
  end
104
105
 
106
+ def contacts
107
+ parser.contacts
108
+ end
105
109
 
106
110
 
107
111
  # Lazy-loads and returns a <tt>Whois::Answer::Parser</tt> proxy for current answer.
@@ -130,7 +134,7 @@ module Whois
130
134
 
131
135
  # Delegates all method calls to the internal parser.
132
136
  def method_missing(method, *args, &block)
133
- if Parser.properties.include?(method)
137
+ if (Parser.properties + Parser::METHODS).include?(method)
134
138
  self.class.class_eval foo = %{
135
139
  def #{method}(*args, &block)
136
140
  if property_supported?(:#{method})
@@ -142,7 +146,7 @@ module Whois
142
146
  }, __FILE__, __LINE__
143
147
  send(method, *args, &block)
144
148
 
145
- elsif method.to_s =~ /([a-z_]+)\?/ and Parser.properties.include?($1.to_sym)
149
+ elsif method.to_s =~ /([a-z_]+)\?/ and (Parser.properties + Parser::METHODS).include?($1.to_sym)
146
150
  self.class.class_eval %{
147
151
  def #{$1}?
148
152
  !#{$1}.nil?
@@ -23,29 +23,30 @@ module Whois
23
23
  #
24
24
  # = Contacts
25
25
  #
26
- # Holds the details of a Contact extracted from the WHOIS answer.
26
+ # Holds the details of a <tt>Contact</tt> extracted from the WHOIS <tt>Answer</tt>.
27
27
  #
28
- # A Contact is composed by the following attributes:
28
+ # A <tt>Contact</tt> is composed by the following attributes:
29
29
  #
30
- # <tt>:id</tt>::
31
- # <tt>:name</tt>::
32
- # <tt>:organization</tt>::
33
- # <tt>:address</tt>::
34
- # <tt>:city</tt>::
35
- # <tt>:zip</tt>::
36
- # <tt>:state</tt>::
37
- # <tt>:country</tt>::
38
- # <tt>:country_code</tt>::
39
- # <tt>:phone</tt>::
40
- # <tt>:fax</tt>::
41
- # <tt>:email</tt>::
42
- # <tt>:created_on</tt>::
43
- # <tt>:updated_on</tt>::
30
+ # * <tt>:id</tt>:
31
+ # * <tt>:type</tt>: the contact type.
32
+ # * <tt>:name</tt>:
33
+ # * <tt>:organization</tt>:
34
+ # * <tt>:address</tt>:
35
+ # * <tt>:city</tt>:
36
+ # * <tt>:zip</tt>:
37
+ # * <tt>:state</tt>:
38
+ # * <tt>:country</tt>:
39
+ # * <tt>:country_code</tt>:
40
+ # * <tt>:phone</tt>:
41
+ # * <tt>:fax</tt>:
42
+ # * <tt>:email</tt>:
43
+ # * <tt>:created_on</tt>:
44
+ # * <tt>:updated_on</tt>:
44
45
  #
45
46
  # Be aware that every WHOIS server can return a different number of details
46
47
  # or no details at all.
47
48
  #
48
- class Contact < SuperStruct.new(:id, :name, :organization,
49
+ class Contact < SuperStruct.new(:id, :name, :organization, :type,
49
50
  :address, :city, :zip, :state, :country, :country_code,
50
51
  :phone, :fax, :email,
51
52
  :created_on, :updated_on)
@@ -22,13 +22,20 @@ module Whois
22
22
  #
23
23
  class Parser
24
24
 
25
+ METHODS = [
26
+ :contacts,
27
+ # deprecated methods
28
+ :registrant, :admin, :technical,
29
+ ]
30
+
25
31
  @@properties = [
26
32
  :disclaimer,
27
33
  :domain, :domain_id,
28
34
  :referral_whois, :referral_url,
29
35
  :status, :available?, :registered?,
30
36
  :created_on, :updated_on, :expires_on,
31
- :registrar, :registrant, :admin, :technical,
37
+ :registrar,
38
+ :registrant_contact, :admin_contact, :technical_contact,
32
39
  :nameservers,
33
40
  ]
34
41
 
@@ -61,11 +68,19 @@ module Whois
61
68
  end
62
69
 
63
70
 
71
+ # Collects and returns all the contacts from all parsers.
72
+ def contacts
73
+ parsers.inject([]) { |all, parser| all.concat(parser.contacts) }
74
+ end
75
+
76
+
64
77
  private
65
78
 
66
79
  def method_missing(method, *args, &block)
67
80
  if Parser.properties.include?(method)
68
81
  delegate_to_parsers(method, *args, &block)
82
+ elsif Parser::METHODS.include?(method)
83
+ delegate_to_parsers(method, *args, &block)
69
84
  else
70
85
  super
71
86
  end
@@ -188,10 +188,6 @@ module Whois
188
188
  @part = part
189
189
  end
190
190
 
191
- ::Whois::Answer::Parser.properties.each do |property|
192
- property_not_implemented(property)
193
- end
194
-
195
191
  def part
196
192
  @part
197
193
  end
@@ -219,6 +215,46 @@ module Whois
219
215
  end
220
216
 
221
217
 
218
+ ::Whois::Answer::Parser.properties.each do |property|
219
+ property_not_implemented(property)
220
+ end
221
+
222
+
223
+ # Returns an array of all supported contacts.
224
+ def contacts
225
+ contacts = []
226
+ contacts.concat([*registrant_contact]) if property_supported?(:registrant_contact)
227
+ contacts.concat([*admin_contact]) if property_supported?(:admin_contact)
228
+ contacts.concat([*technical_contact]) if property_supported?(:technical_contact)
229
+ contacts.compact
230
+ end
231
+
232
+
233
+ # @deprecated {#registrant} is deprecated
234
+ # and will be removed in a future version.
235
+ # Use {#registrant_contact}.
236
+ def registrant
237
+ Whois.deprecate "Whois::Answer::Parser::Base#registrant is deprecated and will be removed in a future version. Use Whois::Answer::Parser::Base#registrant_contact."
238
+ registrant_contact
239
+ end
240
+
241
+ # @deprecated {#admin} is deprecated
242
+ # and will be removed in a future version.
243
+ # Use {#admin_contact}.
244
+ def admin
245
+ Whois.deprecate "Whois::Answer::Parser::Base#admin is deprecated and will be removed in a future version. Use Whois::Answer::Parser::Base#admin_contact."
246
+ admin_contact
247
+ end
248
+
249
+ # @deprecated {#technical} is deprecated
250
+ # and will be removed in a future version.
251
+ # Use {#technical_contact}.
252
+ def technical
253
+ Whois.deprecate "Whois::Answer::Parser::Base#technical is deprecated and will be removed in a future version. Use Whois::Answer::Parser::Base#technical_contact."
254
+ technical_contact
255
+ end
256
+
257
+
222
258
  protected
223
259
 
224
260
  def content_for_scanner
@@ -0,0 +1,71 @@
1
+ #
2
+ # = Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ #
7
+ # Category:: Net
8
+ # Package:: Whois
9
+ # Author:: Simone Carletti <weppos@weppos.net>
10
+ # License:: MIT License
11
+ #
12
+ #--
13
+ #
14
+ #++
15
+
16
+
17
+ require 'whois/answer/parser/base'
18
+
19
+
20
+ module Whois
21
+ class Answer
22
+ class Parser
23
+
24
+ #
25
+ # = whois.ausregistry.net.au parser
26
+ #
27
+ # Parser for the whois.ausregistry.net.au server.
28
+ #
29
+ # NOTE: This parser is just a stub and provides only a few basic methods
30
+ # to check for domain availability and get domain status.
31
+ # Please consider to contribute implementing missing methods.
32
+ # See WhoisNicIt parser for an explanation of all available methods
33
+ # and examples.
34
+ #
35
+ class WhoisAusregistryNetAu < Base
36
+
37
+ property_supported :status do
38
+ @status ||= if content_for_scanner =~ /Status:\s+(.*)\n/
39
+ $1
40
+ end
41
+ end
42
+
43
+ property_supported :available? do
44
+ @available ||= (content_for_scanner.strip == "No Data Found")
45
+ end
46
+
47
+ property_supported :registered? do
48
+ !available?
49
+ end
50
+
51
+
52
+ property_not_supported :created_on
53
+
54
+ property_supported :updated_on do
55
+ @updated_on ||= if content_for_scanner =~ /Last Modified:\s+(.*)\n/
56
+ Time.parse($1)
57
+ end
58
+ end
59
+
60
+ property_not_supported :expires_on
61
+
62
+
63
+ property_supported :nameservers do
64
+ @nameservers ||= content_for_scanner.scan(/Name Server:\s+(.+)\n/).flatten
65
+ end
66
+
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -68,16 +68,16 @@ module Whois
68
68
  end
69
69
  end
70
70
 
71
- property_supported :registrant do
72
- node("Holder")
71
+ property_supported :registrant_contact do
72
+ @registrant_contact ||= node("Holder")
73
73
  end
74
74
 
75
- property_supported :admin do
76
- node("Admin-C")
75
+ property_supported :admin_contact do
76
+ @admin_contact ||= node("Admin-C")
77
77
  end
78
78
 
79
- property_supported :technical do
80
- node("Tech-C")
79
+ property_supported :technical_contact do
80
+ @technical_contact ||= node("Tech-C")
81
81
  end
82
82
 
83
83