Class: Interphase::Helpers::Observable

Inherits:
BasicObject
Defined in:
lib/interphase/helpers/observable.rb

Overview

An object wrapper which can invoke a method whenever the wrapped object changes. Unlike most classes, this class inherits from BasicObject, which has absolutely no methods whatsoever. This means that everything, even inspect and class, fall into Observable#method_missing.

Instance Method Summary collapse

Constructor Details

#initialize(object, &block) ⇒ Observable

Wrap an object in a new instance of Observable. Takes a block which executes upon the object changing. This block is passed object as a paremeter.

object

The object to wrap.



15
16
17
18
19
20
21
# File 'lib/interphase/helpers/observable.rb', line 15

def initialize(object, &block)
  # :: is required because we inherit BasicObject, not Object
  ::Kernal.raise ::ArgumentError, 'Requires a block' if block.nil?

  @object = object
  @on_change = block
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object

TODO responds_to?



24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/interphase/helpers/observable.rb', line 24

def method_missing(name, *args, &block)
  if @object.respond_to?(name)
    before_hash = @object.hash
    ret_val = @object.send(name, *args, &block)
    after_hash = @object.hash

    @on_change.call(@object) if before_hash != after_hash

    ret_val
  else
    super
  end
end

Instance Method Details

#respond_to_missing?Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/interphase/helpers/observable.rb', line 38

def respond_to_missing?(*)
  true
end