gloo 0.3.0 → 0.5.3

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