gloo 0.3.0 → 0.5.3

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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/.rubocop.yml +73 -0
  4. data/Gemfile +2 -2
  5. data/Gemfile.lock +86 -83
  6. data/Rakefile +7 -6
  7. data/bin/console +4 -4
  8. data/gloo.gemspec +22 -18
  9. data/lib/gloo.rb +6 -6
  10. data/lib/gloo/app/args.rb +30 -31
  11. data/lib/gloo/app/engine.rb +80 -30
  12. data/lib/gloo/app/help.rb +17 -11
  13. data/lib/gloo/app/info.rb +3 -3
  14. data/lib/gloo/app/log.rb +17 -17
  15. data/lib/gloo/app/mode.rb +4 -4
  16. data/lib/gloo/app/settings.rb +51 -41
  17. data/lib/gloo/convert/string_to_datetime.rb +21 -0
  18. data/lib/gloo/convert/string_to_decimal.rb +20 -0
  19. data/lib/gloo/convert/string_to_integer.rb +20 -0
  20. data/lib/gloo/core/baseo.rb +7 -7
  21. data/lib/gloo/core/dictionary.rb +30 -27
  22. data/lib/gloo/core/error.rb +50 -0
  23. data/lib/gloo/core/event_manager.rb +17 -23
  24. data/lib/gloo/core/factory.rb +149 -39
  25. data/lib/gloo/core/gloo_system.rb +121 -54
  26. data/lib/gloo/core/heap.rb +15 -13
  27. data/lib/gloo/core/it.rb +5 -5
  28. data/lib/gloo/core/literal.rb +7 -7
  29. data/lib/gloo/core/obj.rb +138 -79
  30. data/lib/gloo/core/obj_finder.rb +9 -14
  31. data/lib/gloo/core/op.rb +8 -8
  32. data/lib/gloo/core/parser.rb +27 -26
  33. data/lib/gloo/core/pn.rb +68 -52
  34. data/lib/gloo/core/script.rb +7 -7
  35. data/lib/gloo/core/tokens.rb +39 -41
  36. data/lib/gloo/core/verb.rb +30 -19
  37. data/lib/gloo/exec/dispatch.rb +30 -0
  38. data/lib/gloo/exec/runner.rb +43 -0
  39. data/lib/gloo/expr/expression.rb +36 -43
  40. data/lib/gloo/expr/l_boolean.rb +7 -6
  41. data/lib/gloo/expr/l_decimal.rb +34 -0
  42. data/lib/gloo/expr/l_integer.rb +5 -4
  43. data/lib/gloo/expr/l_string.rb +13 -15
  44. data/lib/gloo/expr/op_div.rb +5 -5
  45. data/lib/gloo/expr/op_minus.rb +5 -5
  46. data/lib/gloo/expr/op_mult.rb +5 -5
  47. data/lib/gloo/expr/op_plus.rb +7 -7
  48. data/lib/gloo/objs/basic/alias.rb +111 -0
  49. data/lib/gloo/objs/basic/boolean.rb +63 -38
  50. data/lib/gloo/objs/basic/container.rb +71 -12
  51. data/lib/gloo/objs/basic/decimal.rb +96 -0
  52. data/lib/gloo/objs/basic/integer.rb +45 -16
  53. data/lib/gloo/objs/basic/script.rb +62 -38
  54. data/lib/gloo/objs/basic/string.rb +47 -15
  55. data/lib/gloo/objs/basic/text.rb +69 -21
  56. data/lib/gloo/objs/basic/untyped.rb +35 -10
  57. data/lib/gloo/objs/cli/banner.rb +137 -0
  58. data/lib/gloo/objs/cli/bar.rb +141 -0
  59. data/lib/gloo/objs/cli/colorize.rb +54 -24
  60. data/lib/gloo/objs/cli/confirm.rb +63 -29
  61. data/lib/gloo/objs/cli/menu.rb +236 -0
  62. data/lib/gloo/objs/cli/menu_item.rb +128 -0
  63. data/lib/gloo/objs/cli/pastel.rb +120 -0
  64. data/lib/gloo/objs/cli/prompt.rb +73 -31
  65. data/lib/gloo/objs/cli/select.rb +153 -0
  66. data/lib/gloo/objs/ctrl/each.rb +128 -61
  67. data/lib/gloo/objs/ctrl/repeat.rb +129 -0
  68. data/lib/gloo/objs/data/markdown.rb +109 -0
  69. data/lib/gloo/objs/data/table.rb +168 -0
  70. data/lib/gloo/objs/dev/git.rb +98 -64
  71. data/lib/gloo/objs/dt/date.rb +72 -0
  72. data/lib/gloo/objs/dt/datetime.rb +84 -0
  73. data/lib/gloo/objs/dt/time.rb +72 -0
  74. data/lib/gloo/objs/ror/erb.rb +82 -41
  75. data/lib/gloo/objs/ror/eval.rb +73 -31
  76. data/lib/gloo/objs/snd/play.rb +71 -0
  77. data/lib/gloo/objs/snd/say.rb +120 -0
  78. data/lib/gloo/objs/system/file_handle.rb +129 -48
  79. data/lib/gloo/objs/system/system.rb +84 -38
  80. data/lib/gloo/objs/web/http_get.rb +103 -46
  81. data/lib/gloo/objs/web/http_post.rb +70 -44
  82. data/lib/gloo/objs/web/json.rb +155 -0
  83. data/lib/gloo/objs/web/slack.rb +89 -58
  84. data/lib/gloo/objs/web/teams.rb +88 -53
  85. data/lib/gloo/objs/web/uri.rb +160 -0
  86. data/lib/gloo/persist/file_loader.rb +95 -85
  87. data/lib/gloo/persist/file_saver.rb +12 -12
  88. data/lib/gloo/persist/file_storage.rb +15 -15
  89. data/lib/gloo/persist/line_splitter.rb +79 -0
  90. data/lib/gloo/persist/persist_man.rb +63 -39
  91. data/lib/gloo/utils/words.rb +2 -2
  92. data/lib/gloo/verbs/alert.rb +67 -16
  93. data/lib/gloo/verbs/beep.rb +70 -0
  94. data/lib/gloo/verbs/cls.rb +67 -0
  95. data/lib/gloo/verbs/context.rb +61 -21
  96. data/lib/gloo/verbs/create.rb +52 -21
  97. data/lib/gloo/verbs/help.rb +186 -27
  98. data/lib/gloo/verbs/if.rb +55 -21
  99. data/lib/gloo/verbs/list.rb +55 -24
  100. data/lib/gloo/verbs/load.rb +47 -12
  101. data/lib/gloo/verbs/move.rb +128 -0
  102. data/lib/gloo/verbs/put.rb +90 -34
  103. data/lib/gloo/verbs/quit.rb +43 -12
  104. data/lib/gloo/verbs/run.rb +63 -18
  105. data/lib/gloo/verbs/save.rb +45 -10
  106. data/lib/gloo/verbs/show.rb +56 -22
  107. data/lib/gloo/verbs/tell.rb +45 -13
  108. data/lib/gloo/verbs/unless.rb +56 -21
  109. data/lib/gloo/verbs/version.rb +42 -12
  110. data/lib/gloo/verbs/wait.rb +73 -0
  111. data/lib/run.rb +5 -5
  112. metadata +90 -12
@@ -6,46 +6,45 @@
6
6
  # system level variables and functions. But it is not
7
7
  # actually an object in the normal sense of the word.
8
8
  #
9
+ require 'tty-platform'
9
10
 
10
11
  module Gloo
11
12
  module Core
12
13
  class GlooSystem < Obj
13
-
14
- KEYWORD = 'gloo'
15
- KEYWORD_SHORT = '$'
16
-
17
- attr_reader :pn
18
14
 
15
+ KEYWORD = 'gloo'.freeze
16
+ KEYWORD_SHORT = '$'.freeze
17
+
18
+ attr_reader :pn
19
19
 
20
20
  # Set up the object.
21
21
  def initialize( pn )
22
22
  @pn = pn
23
23
  end
24
-
25
- #
24
+
25
+ #
26
26
  # The name of the object type.
27
- #
27
+ #
28
28
  def self.typename
29
29
  return KEYWORD
30
30
  end
31
31
 
32
- #
32
+ #
33
33
  # The short name of the object type.
34
- #
34
+ #
35
35
  def self.short_typename
36
36
  return KEYWORD_SHORT
37
37
  end
38
38
 
39
- #
39
+ #
40
40
  # The object type, suitable for display.
41
- #
41
+ #
42
42
  def type_display
43
43
  return self.class.typename
44
44
  end
45
45
 
46
-
47
46
  # Is this the root object?
48
- def is_root?
47
+ def root?
49
48
  return false
50
49
  end
51
50
 
@@ -56,61 +55,61 @@ module Gloo
56
55
  false
57
56
  end
58
57
 
59
-
60
58
  # ---------------------------------------------------------------------
61
59
  # Value
62
60
  # ---------------------------------------------------------------------
63
61
 
64
- #
62
+ #
65
63
  # Get the parameter.
66
- #
64
+ #
67
65
  def param
68
66
  return nil unless @pn && @pn.segments.count > 1
69
- return @pn.segments[1..-1].join( "_" )
67
+
68
+ return @pn.segments[ 1..-1 ].join( '_' )
70
69
  end
71
-
70
+
72
71
  #
73
72
  # Get the system value.
74
- #
73
+ #
75
74
  def value
76
75
  return dispatch param
77
76
  end
78
-
79
- #
77
+
78
+ #
80
79
  # There is no value object in the system.
81
- #
82
- def set_value new_value
80
+ #
81
+ def set_value( new_value )
82
+ # overriding base functionality with dummy function
83
83
  end
84
-
85
- #
84
+
85
+ #
86
86
  # Get the value for display purposes.
87
- #
87
+ #
88
88
  def value_display
89
89
  return value
90
90
  end
91
-
92
- #
91
+
92
+ #
93
93
  # Is the value a String?
94
- #
95
- def value_is_string?
94
+ #
95
+ def value_string?
96
96
  return true
97
97
  end
98
98
 
99
- #
99
+ #
100
100
  # Is the value an Array?
101
- #
101
+ #
102
102
  def value_is_array?
103
103
  return false
104
104
  end
105
-
106
- #
105
+
106
+ #
107
107
  # Is the value a blank string?
108
- #
108
+ #
109
109
  def value_is_blank?
110
110
  return true
111
111
  end
112
112
 
113
-
114
113
  # ---------------------------------------------------------------------
115
114
  # Children
116
115
  # ---------------------------------------------------------------------
@@ -122,34 +121,31 @@ module Gloo
122
121
  return false
123
122
  end
124
123
 
125
-
126
124
  # ---------------------------------------------------------------------
127
125
  # Messages
128
126
  # ---------------------------------------------------------------------
129
127
 
130
- #
128
+ #
131
129
  # Get a list of message names that this object receives.
132
- #
130
+ #
133
131
  def self.messages
134
132
  return []
135
133
  end
136
-
134
+
137
135
  # Dispatch the message and get the value.
138
- def dispatch msg
136
+ def dispatch( msg )
139
137
  o = "msg_#{msg}"
140
- if self.respond_to? o
141
- return self.public_send( o )
142
- else
143
- $log.error "Message #{msg} not implemented"
144
- return false
145
- end
146
- end
147
-
138
+ return self.public_send( o ) if self.respond_to? o
139
+
140
+ $log.error "Message #{msg} not implemented"
141
+ return false
142
+ end
143
+
148
144
  # Get the system hostname.
149
145
  def msg_hostname
150
146
  return Socket.gethostname
151
147
  end
152
-
148
+
153
149
  # Get the logged in User.
154
150
  def msg_user
155
151
  return ENV[ 'USER' ]
@@ -157,14 +153,14 @@ module Gloo
157
153
 
158
154
  # Get the user's home directory.
159
155
  def msg_user_home
160
- return File.expand_path( "~" )
156
+ return File.expand_path( '~' )
161
157
  end
162
158
 
163
- # Get the working directory.
159
+ # Get the working directory.
164
160
  def msg_working_dir
165
161
  return Dir.pwd
166
162
  end
167
-
163
+
168
164
  # Get the Gloo home directory
169
165
  def msg_gloo_home
170
166
  return $settings.user_root
@@ -185,6 +181,77 @@ module Gloo
185
181
  return $settings.log_path
186
182
  end
187
183
 
184
+ # ---------------------------------------------------------------------
185
+ # Screen Messages
186
+ # ---------------------------------------------------------------------
187
+
188
+ # Get the number of lines on screen.
189
+ def msg_screen_lines
190
+ return Gloo::App::Settings.lines
191
+ end
192
+
193
+ # Get the number of columns on screen.
194
+ def msg_screen_cols
195
+ return Gloo::App::Settings.cols
196
+ end
197
+
198
+ # ---------------------------------------------------------------------
199
+ # Platform Messages
200
+ # ---------------------------------------------------------------------
201
+
202
+ # Get the platform CPU
203
+ def msg_platform_cpu
204
+ platform = TTY::Platform.new
205
+ return platform.cpu
206
+ end
207
+
208
+ # Get the platform Operating System
209
+ def msg_platform_os
210
+ platform = TTY::Platform.new
211
+ return platform.os
212
+ end
213
+
214
+ # Get the platform version
215
+ def msg_platform_version
216
+ platform = TTY::Platform.new
217
+ return platform.version
218
+ end
219
+
220
+ # Is the platform Windows?
221
+ def msg_platform_windows?
222
+ platform = TTY::Platform.new
223
+ return platform.windows?
224
+ end
225
+
226
+ # Is the platform Unix?
227
+ def msg_platform_unix?
228
+ platform = TTY::Platform.new
229
+ return platform.unix?
230
+ end
231
+
232
+ # Is the platform Linux?
233
+ def msg_platform_linux?
234
+ platform = TTY::Platform.new
235
+ return platform.linux?
236
+ end
237
+
238
+ # Is the platform Mac?
239
+ def msg_platform_mac?
240
+ platform = TTY::Platform.new
241
+ return platform.mac?
242
+ end
243
+
244
+ #
245
+ # Get the command to open a file on this platform.
246
+ #
247
+ def self.open_for_platform
248
+ platform = TTY::Platform.new
249
+ return 'open' if platform.mac?
250
+ return 'xdg-open' if platform.linux?
251
+
252
+ return nil
253
+ end
254
+
188
255
  end
189
256
  end
190
257
  end
@@ -9,34 +9,36 @@
9
9
  module Gloo
10
10
  module Core
11
11
  class Heap
12
-
12
+
13
13
  # The context is a reference to an object, usually a container.
14
14
  # The context will be the root by default.
15
15
  attr_reader :context
16
-
16
+
17
17
  # TODO: Do I need a running script context?
18
18
  # how to resolve relative reference.
19
-
20
- attr_reader :it, :root
21
-
19
+
20
+ attr_reader :it, :root, :error
21
+
22
22
  # Set up the object heap.
23
- def initialize()
24
- $log.debug "object heap intialized..."
25
-
23
+ def initialize
24
+ $log.debug 'object heap intialized...'
25
+
26
26
  @root = Gloo::Objs::Container.new
27
- @root.name = "root"
28
-
27
+ @root.name = 'root'
28
+
29
29
  @context = Pn.root
30
30
  @it = It.new
31
+ @error = Error.new
31
32
  end
32
-
33
+
33
34
  # Unload the given obj--remove it from the heap.
34
- def unload obj
35
+ def unload( obj )
35
36
  can = obj.parent.nil? ? @root : obj.parent
36
37
  return unless can
38
+
37
39
  can.remove_child obj
38
40
  end
39
-
41
+
40
42
  end
41
43
  end
42
44
  end
@@ -7,16 +7,16 @@
7
7
  module Gloo
8
8
  module Core
9
9
  class It
10
-
10
+
11
11
  attr_accessor :value
12
-
12
+
13
13
  # Set up the object.
14
- def initialize()
14
+ def initialize
15
15
  @value = nil
16
16
  end
17
-
17
+
18
18
  # Set the value of it.
19
- def set_to new_value
19
+ def set_to( new_value )
20
20
  @value = new_value
21
21
  end
22
22
 
@@ -7,19 +7,19 @@
7
7
  module Gloo
8
8
  module Core
9
9
  class Literal
10
-
10
+
11
11
  attr_reader :value
12
-
12
+
13
13
  # Create the expression from a list of tokens.
14
- def initialize value
14
+ def initialize( value )
15
15
  set_value( value )
16
16
  end
17
-
17
+
18
18
  # Set the literal value.
19
- def set_value value
19
+ def set_value( value )
20
20
  @value = value
21
- end
22
-
21
+ end
22
+
23
23
  end
24
24
  end
25
25
  end
@@ -8,47 +8,48 @@
8
8
  module Gloo
9
9
  module Core
10
10
  class Obj < Baseo
11
-
11
+
12
12
  attr_accessor :value
13
13
  attr_reader :children, :parent
14
14
 
15
15
  # Set up the object.
16
- def initialize()
17
- @value = ""
16
+ def initialize
17
+ @value = ''
18
18
  @children = []
19
19
  @parent = nil
20
20
  end
21
-
21
+
22
22
  # Register object types when they are loaded.
23
23
  def self.inherited( subclass )
24
24
  Dictionary.instance.register_obj( subclass )
25
25
  end
26
26
 
27
- #
27
+ #
28
28
  # The name of the object type.
29
- #
29
+ #
30
30
  def self.typename
31
31
  raise 'this method should be overriden'
32
32
  end
33
33
 
34
- #
34
+ #
35
35
  # The object type, suitable for display.
36
- #
36
+ #
37
37
  def type_display
38
38
  return self.class.typename
39
39
  end
40
40
 
41
- #
41
+ #
42
42
  # Set the parent for the object.
43
- #
44
- def set_parent obj
43
+ #
44
+ def set_parent( obj )
45
45
  @parent = obj
46
46
  end
47
-
47
+
48
48
  # Is this the root object?
49
- def is_root?
49
+ def root?
50
50
  return false if @parent
51
- return false unless name.downcase == "root"
51
+ return false unless name.downcase == 'root'
52
+
52
53
  return true
53
54
  end
54
55
 
@@ -58,165 +59,223 @@ module Gloo
58
59
  def self.can_create?
59
60
  true
60
61
  end
61
-
62
-
62
+
63
+ #
64
+ # Get the path and name to this object.
65
+ #
66
+ def pn
67
+ str = self.name
68
+ p = self.parent
69
+ while p && !p.root?
70
+ str = "#{p.name}.#{str}"
71
+ p = p.parent
72
+ end
73
+ return str
74
+ end
75
+
63
76
  # ---------------------------------------------------------------------
64
77
  # Value
65
78
  # ---------------------------------------------------------------------
66
79
 
67
- #
80
+ #
68
81
  # Set the value with any necessary type conversions.
69
- #
70
- def set_value new_value
82
+ #
83
+ def set_value( new_value )
71
84
  self.value = new_value
72
85
  end
73
-
74
- #
86
+
87
+ #
75
88
  # Get the value for display purposes.
76
- #
89
+ #
77
90
  def value_display
78
91
  return self.value.to_s
79
92
  end
80
-
81
- #
93
+
94
+ #
82
95
  # Does this object support multi-line values?
83
96
  # Initially only true for scripts.
84
- #
85
- def has_multiline_value?
97
+ #
98
+ def multiline_value?
86
99
  return false
87
100
  end
88
-
89
- #
101
+
102
+ #
90
103
  # Is the value a String?
91
- #
92
- def value_is_string?
104
+ #
105
+ def value_string?
93
106
  return self.value.is_a? String
94
107
  end
95
108
 
96
- #
109
+ #
97
110
  # Is the value an Array?
98
- #
111
+ #
99
112
  def value_is_array?
100
113
  return self.value.is_a? Array
101
114
  end
102
-
103
- #
115
+
116
+ #
104
117
  # Is the value a blank string?
105
- #
118
+ #
106
119
  def value_is_blank?
107
120
  return true if value.nil?
121
+
108
122
  return self.value.to_s.strip.empty?
109
123
  end
110
-
111
124
 
112
125
  # ---------------------------------------------------------------------
113
126
  # Children
114
127
  # ---------------------------------------------------------------------
115
-
128
+
129
+ #
130
+ # Find a child of the given name.
131
+ # If found, return it. If not found create it.
132
+ #
133
+ def find_add_child( name, type )
134
+ child = self.find_child( name )
135
+ return child if child
136
+
137
+ params = { :name => name,
138
+ :type => type,
139
+ :value => nil,
140
+ :parent => self }
141
+ return $engine.factory.create params
142
+ end
143
+
116
144
  # Add a child object to the container.
117
- def add_child obj
145
+ def add_child( obj )
118
146
  @children << obj
119
147
  obj.set_parent self
120
148
  end
121
-
149
+
122
150
  # Get the number of children.
123
151
  def child_count
124
152
  return @children.count
125
153
  end
126
-
154
+
127
155
  # Does this object contain an object with the given name?
128
- def has_child? name
156
+ def contains_child?( name )
129
157
  @children.each do |o|
130
- return true if ( name.downcase == o.name.downcase )
158
+ return true if name.downcase == o.name.downcase
131
159
  end
132
160
  return false
133
161
  end
134
162
 
135
163
  # Find a child object with the given name.
136
- def find_child name
164
+ def find_child( name )
165
+ if name.end_with?( Gloo::Objs::Alias::ALIAS_REFERENCE )
166
+ name = name[ 0..-2 ]
167
+ end
168
+
137
169
  @children.each do |o|
138
- return o if ( name.downcase == o.name.downcase )
170
+ return o if name.downcase == o.name.downcase
171
+ end
172
+
173
+ if self.type_display == Gloo::Objs::Alias.typename
174
+ ln = Gloo::Core::Pn.new( self.value )
175
+ redirect = ln.resolve
176
+ return redirect.find_child( name )
139
177
  end
140
178
  return nil
141
179
  end
142
-
180
+
181
+ #
182
+ # Delete all children from the container.
183
+ #
184
+ def delete_children
185
+ @children.reverse.each do |o|
186
+ self.remove_child o
187
+ end
188
+ end
189
+
190
+ #
143
191
  # Remove the object from the children collection.
144
- def remove_child obj
192
+ #
193
+ def remove_child( obj )
145
194
  @children.delete obj
146
195
  end
147
-
196
+
148
197
  # Does this object have children to add when an object
149
198
  # is created in interactive mode?
150
199
  # This does not apply during obj load, etc.
151
200
  def add_children_on_create?
152
201
  return false
153
202
  end
154
-
203
+
155
204
  # Add children to this object.
156
- # This is used by containers to add children needed
205
+ # This is used by containers to add children needed
157
206
  # for default configurations.
158
207
  def add_default_children
208
+ # Override this.
159
209
  end
160
210
 
161
-
162
211
  # ---------------------------------------------------------------------
163
212
  # Messages
164
213
  # ---------------------------------------------------------------------
165
214
 
166
- #
215
+ #
167
216
  # Get a list of message names that this object receives.
168
- #
217
+ #
169
218
  def self.messages
170
- return [ "unload" ]
219
+ return %w[unload]
171
220
  end
172
-
173
- #
221
+
222
+ #
174
223
  # Can this object receive a message?
175
- #
176
- def can_receive_message? msg
224
+ #
225
+ def can_receive_message?( msg )
177
226
  msgs = self.class.messages
178
227
  return msgs.include?( msg.strip.downcase )
179
228
  end
180
229
 
181
- #
230
+ #
182
231
  # Sent this object the given message.
183
- #
184
- def send_message msg, params=nil
185
- @params = params
186
- if self.can_receive_message? msg
187
- return self.dispatch msg
188
- else
189
- $log.error "Object #{self.name} cannot receive message #{msg}"
190
- return false
191
- end
232
+ #
233
+ def send_message( msg, params = nil )
234
+ @params = params
235
+ return self.dispatch msg if self.can_receive_message? msg
236
+
237
+ $log.error "Object #{self.name} cannot receive message #{msg}"
238
+ return false
192
239
  end
193
-
194
- #
240
+
241
+ #
195
242
  # Dispatch the message to the object.
196
- #
197
- def dispatch msg
243
+ #
244
+ def dispatch( msg )
198
245
  o = "msg_#{msg}"
199
- if self.respond_to? o
200
- self.public_send( o )
246
+ if self.respond_to? o
247
+ self.public_send( o )
201
248
  return true
202
249
  else
203
250
  $log.error "Message #{msg} not implemented"
204
251
  return false
205
252
  end
206
253
  end
207
-
208
- #
254
+
255
+ #
209
256
  # Send the object the unload message.
210
- #
257
+ #
211
258
  def msg_unload
212
- if self.is_root?
213
- $log.error "Cannot unload the root object."
259
+ if self.root?
260
+ $log.error 'Cannot unload the root object.'
214
261
  return
215
262
  end
263
+
216
264
  $engine.event_manager.on_unload self
217
265
  $engine.heap.unload self
218
266
  end
219
-
267
+
268
+ # ---------------------------------------------------------------------
269
+ # Help
270
+ # ---------------------------------------------------------------------
271
+
272
+ #
273
+ # Get help for this object.
274
+ #
275
+ def self.help
276
+ return 'No help found.'
277
+ end
278
+
220
279
  end
221
280
  end
222
281
  end