Class: Gloo::Core::Obj

Inherits:
Baseo
  • Object
show all
Defined in:
lib/gloo/core/obj.rb

Constant Summary

Constants inherited from Baseo

Baseo::NOT_IMPLEMENTED_ERR

Instance Attribute Summary collapse

Attributes inherited from Baseo

#name

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(engine) ⇒ Obj

Set up the object.



18
19
20
21
22
23
# File 'lib/gloo/core/obj.rb', line 18

def initialize( engine )
  @engine = engine
  @value = ''
  @children = []
  @parent = nil
end

Instance Attribute Details

#childrenObject (readonly)

Returns the value of attribute children.



13
14
15
# File 'lib/gloo/core/obj.rb', line 13

def children
  @children
end

#parentObject (readonly)

Returns the value of attribute parent.



13
14
15
# File 'lib/gloo/core/obj.rb', line 13

def parent
  @parent
end

#valueObject

Returns the value of attribute value.



12
13
14
# File 'lib/gloo/core/obj.rb', line 12

def value
  @value
end

Class Method Details

.can_create?Boolean

Can this object be created? This is true by default and only false for some special cases such as the System object.

Returns:

  • (Boolean)


66
67
68
# File 'lib/gloo/core/obj.rb', line 66

def self.can_create?
  true
end

.helpObject

Get help for this object.



427
428
429
# File 'lib/gloo/core/obj.rb', line 427

def self.help
  return 'No help found.'
end

.inherited(subclass) ⇒ Object

Register object types when they are loaded.



28
29
30
# File 'lib/gloo/core/obj.rb', line 28

def self.inherited( subclass )
  Dictionary.instance.register_obj( subclass )
end

.messagesObject

Get a list of message names that this object receives.



304
305
306
# File 'lib/gloo/core/obj.rb', line 304

def self.messages
  return %w[reload unload blank? contains? responds_to?]
end

.typenameObject

The name of the object type.



35
36
37
# File 'lib/gloo/core/obj.rb', line 35

def self.typename
  raise 'this method should be overriden'
end

Instance Method Details

#add_child(obj) ⇒ Object

Add a child object to the container.



191
192
193
194
# File 'lib/gloo/core/obj.rb', line 191

def add_child( obj )
  @children << obj
  obj.set_parent self
end

#add_children_on_create?Boolean

Does this object have children to add when an object is created in interactive mode? This does not apply during obj load, etc.

Returns:

  • (Boolean)


286
287
288
# File 'lib/gloo/core/obj.rb', line 286

def add_children_on_create?
  return false
end

#add_default_childrenObject

Add children to this object. This is used by containers to add children needed for default configurations.



293
294
295
# File 'lib/gloo/core/obj.rb', line 293

def add_default_children
  # Override this.
end

#can_receive_message?(msg) ⇒ Boolean

Can this object receive a message?

Returns:

  • (Boolean)


311
312
313
314
# File 'lib/gloo/core/obj.rb', line 311

def can_receive_message?( msg )
  msgs = self.class.messages
  return msgs.include?( msg.strip.downcase )
end

#child_countObject

Get the number of children.



199
200
201
# File 'lib/gloo/core/obj.rb', line 199

def child_count
  return @children.count
end

#child_index(name) ⇒ Object

Get the index of the child with the given name.



260
261
262
263
264
265
# File 'lib/gloo/core/obj.rb', line 260

def child_index( name )
  @children.each_with_index do |o, i|
    return i if name.downcase == o.name.downcase
  end
  return nil
end

#contains_child?(name) ⇒ Boolean

Does this object contain an object with the given name?

Returns:

  • (Boolean)


206
207
208
209
210
211
# File 'lib/gloo/core/obj.rb', line 206

def contains_child?( name )
  @children.each do |o|
    return true if name.downcase == o.name.downcase
  end
  return false
end

#delete_childrenObject

Delete all children from the container.



270
271
272
273
274
# File 'lib/gloo/core/obj.rb', line 270

def delete_children
  @children.reverse.each do |o|
    self.remove_child o
  end
end

#dispatch(msg) ⇒ Object

Dispatch the message to the object.



330
331
332
333
334
335
336
337
338
339
# File 'lib/gloo/core/obj.rb', line 330

def dispatch( msg )
  o = "msg_#{msg}"
  if self.respond_to? o
    self.public_send( o )
    return true
  else
    @engine.err "Message #{msg} not implemented"
    return false
  end
end

#display_valueObject

Generic function to get display value. Can be used for debugging, etc.



87
88
89
# File 'lib/gloo/core/obj.rb', line 87

def display_value
  return self.pn
end

#find_add_child(name, type) ⇒ Object

Find a child of the given name. If found, return it. If not found create it.



177
178
179
180
181
182
183
184
185
186
# File 'lib/gloo/core/obj.rb', line 177

def find_add_child( name, type )
  child = self.find_child( name )
  return child if child

  params = { :name => name,
             :type => type,
             :value => nil,
             :parent => self }
  return @engine.factory.create params
end

#find_child(name) ⇒ Object

Find a child object with the given name.



216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
# File 'lib/gloo/core/obj.rb', line 216

def find_child( name )
  if name.end_with?( Gloo::Objs::Alias::ALIAS_REFERENCE )
    name = name[ 0..-2 ]
  end

  @children.each do |o|
    return o if name.downcase == o.name.downcase
  end

  if is_alias?
    ln = Gloo::Core::Pn.new( @engine, self.value )
    redirect = ln.resolve
    return redirect.find_child( name )
  end
  return nil
end

#find_child_resolve_alias(name) ⇒ Object

Find a child, resolve any alias references. This returns the object, not the value.



237
238
239
240
241
242
243
# File 'lib/gloo/core/obj.rb', line 237

def find_child_resolve_alias( name )
  o = find_child name
  return nil unless o

  o = Gloo::Objs::Alias.resolve_alias( @engine, o )
  return o
end

#find_child_value(name) ⇒ Object

Find a child, resolve any alias references, and return the object’s value.



249
250
251
252
253
254
255
# File 'lib/gloo/core/obj.rb', line 249

def find_child_value( name )
  o = find_child name
  return nil unless o

  o = Gloo::Objs::Alias.resolve_alias( @engine, o )
  return o&.value
end

#is_alias?Boolean

Is this an alias to another object?

Returns:

  • (Boolean)


150
151
152
# File 'lib/gloo/core/obj.rb', line 150

def is_alias?
  return self.type_display == Gloo::Objs::Alias.typename
end

#is_container?Boolean

Is this a container object?

Returns:

  • (Boolean)


157
158
159
# File 'lib/gloo/core/obj.rb', line 157

def is_container?
  return self.type_display == Gloo::Objs::Container.typename
end

#is_function?Boolean

Is this a function object?

Returns:

  • (Boolean)


164
165
166
# File 'lib/gloo/core/obj.rb', line 164

def is_function?
  return self.type_display == Gloo::Objs::Function.typename
end

#msg_blank?Boolean

Check to see if the value is blank.

Returns:

  • (Boolean)


373
374
375
376
377
# File 'lib/gloo/core/obj.rb', line 373

def msg_blank?
  val_blank = value.blank?
  @engine.heap.it.set_to val_blank
  return val_blank
end

#msg_contains?Boolean

Check to see if there are children.

Returns:

  • (Boolean)


382
383
384
385
386
# File 'lib/gloo/core/obj.rb', line 382

def msg_contains?
  has_children = child_count.positive?
  @engine.heap.it.set_to has_children
  return has_children
end

#msg_reloadObject

Send the object the reload message. Note that this will only work for objects with file assoications. This will reload the object but the rest of the engine state will remain unchanged.



361
362
363
364
365
366
367
368
# File 'lib/gloo/core/obj.rb', line 361

def msg_reload
  if self.root?
    @engine.err 'Cannot reload the root object.'
    return
  end

  @engine.persist_man.reload self
end

#msg_responds_to?Boolean

Check to see if the object responds to a message.

Returns:

  • (Boolean)


391
392
393
394
395
396
397
398
399
400
401
402
403
# File 'lib/gloo/core/obj.rb', line 391

def msg_responds_to?
  if @params&.token_count&.positive?
    expr = Gloo::Expr::Expression.new( @engine, @params.tokens )
    data = expr.evaluate

    result = self.can_receive_message?( data )
    @engine.heap.it.set_to result
    return result
  else
    @engine.heap.it.set_to false
    return false
  end
end

#msg_unloadObject

Send the object the unload message. This will unload the object but the rest of the engine state will remain unchanged.



346
347
348
349
350
351
352
353
# File 'lib/gloo/core/obj.rb', line 346

def msg_unload
  if self.root?
    @engine.err 'Cannot unload the root object.'
    return
  end

  @engine.persist_man.unload self
end

#multiline_value?Boolean

Does this object support multi-line values? Initially only true for scripts.

Returns:

  • (Boolean)


113
114
115
# File 'lib/gloo/core/obj.rb', line 113

def multiline_value?
  return false
end

#pnObject

Get the path and name to this object.



73
74
75
76
77
78
79
80
81
# File 'lib/gloo/core/obj.rb', line 73

def pn
  str = self.name
  p = self.parent
  while p && !p.root?
    str = "#{p.name}.#{str}"
    p = p.parent
  end
  return str
end

#remove_child(obj) ⇒ Object

Remove the object from the children collection.



279
280
281
# File 'lib/gloo/core/obj.rb', line 279

def remove_child( obj )
  @children.delete obj
end

#render(render_ƒ) ⇒ Object

Render the object. By default this is just the object’s value. The render_ƒ is ‘render_html’, ‘render_text’, ‘render_json’, etc.



415
416
417
# File 'lib/gloo/core/obj.rb', line 415

def render render_ƒ
  return self.value.to_s
end

#root?Boolean

Is this the root object?

Returns:

  • (Boolean)


56
57
58
59
60
61
# File 'lib/gloo/core/obj.rb', line 56

def root?
  return false if @parent
  return false unless name.downcase == 'root'

  return true
end

#send_message(msg, params = nil) ⇒ Object

Sent this object the given message.



319
320
321
322
323
324
325
# File 'lib/gloo/core/obj.rb', line 319

def send_message( msg, params = nil )
  @params = params
  return self.dispatch msg if self.can_receive_message? msg

  @engine.err "Object #{self.name} cannot receive message #{msg}"
  return false
end

#set_parent(obj) ⇒ Object

Set the parent for the object.



49
50
51
# File 'lib/gloo/core/obj.rb', line 49

def set_parent( obj )
  @parent = obj
end

#set_value(new_value) ⇒ Object

Set the value with any necessary type conversions.



98
99
100
# File 'lib/gloo/core/obj.rb', line 98

def set_value( new_value )
  self.value = new_value
end

#sql_valueObject

Value for a SQL query.



143
144
145
# File 'lib/gloo/core/obj.rb', line 143

def sql_value
  return self.value
end

#type_displayObject

The object type, suitable for display.



42
43
44
# File 'lib/gloo/core/obj.rb', line 42

def type_display
  return self.class.typename
end

#value_displayObject

Get the value for display purposes.



105
106
107
# File 'lib/gloo/core/obj.rb', line 105

def value_display
  return self.value.to_s
end

#value_is_array?Boolean

Is the value an Array?

Returns:

  • (Boolean)


127
128
129
# File 'lib/gloo/core/obj.rb', line 127

def value_is_array?
  return self.value.is_a? Array
end

#value_is_blank?Boolean

Is the value a blank string?

Returns:

  • (Boolean)


134
135
136
137
138
# File 'lib/gloo/core/obj.rb', line 134

def value_is_blank?
  return true if value.nil?

  return self.value.to_s.strip.empty?
end

#value_string?Boolean

Is the value a String?

Returns:

  • (Boolean)


120
121
122
# File 'lib/gloo/core/obj.rb', line 120

def value_string?
  return self.value.is_a? String
end