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


27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/interphase/helpers/observable.rb', line 27

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?(name) ⇒ Boolean

Returns:

  • (Boolean)

23
24
25
# File 'lib/interphase/helpers/observable.rb', line 23

def respond_to?(name)
  @object.respond_to?(name)
end

#respond_to_missing?Boolean

Returns:

  • (Boolean)

41
42
43
# File 'lib/interphase/helpers/observable.rb', line 41

def respond_to_missing?(*)
  true
end