Module: Xavier

Defined in:
lib/xavier.rb,
lib/xavier/state.rb,
lib/xavier/states.rb,
lib/xavier/mutator.rb,
lib/xavier/version.rb,
lib/xavier/observer.rb,
lib/xavier/mutation_strategies/class_copy.rb,
lib/xavier/mutation_strategies/instance_copy.rb

Overview

Wraps the gem logic in an accessible way.

Defined Under Namespace

Modules: MutationStrategies Classes: Mutator, Observer, State, States

Constant Summary collapse

AlreadyObserved =

Raised when attempting to observe a class or instance already under observation.

Class.new(RuntimeError)
VERSION =

The version of the gem

'0.1.0'

Class Method Summary collapse

Class Method Details

.observe(observable) { ... } ⇒ Integer

Observes an object, yields a block and then reverts the observed object’s class and instance variables.

Examples:

Observing a class

class EvilSingleton
  @@mutated = false
  @mutated = false

  def self.mutate
    @@mutated = true
    @mutated = true
  end

  def self.mutated?
    @@mutated && @mutated
  end
end

Xavier.observe(EvilSingleton) do
  EvilSingleton.mutated? # => false
  EvilSingleton.mutate
  EvilSingleton.mutated? # => true
end

EvilSingleton.mutated? # => false

Observing an instance

class InstanceSingleton
  def initialize
    @mutated = false
  end

  def mutate
    @mutated = true
  end

  def mutated?
    @mutated
  end
end

evil_singleton = InstanceSingleton.new

Xavier.observe(evil_singleton) do
  evil_singleton.mutated? # => false
  evil_singleton.mutate
  evil_singleton.mutated? # => true
end

evil_singleton.mutated? # => false

Parameters:

  • observable

    The object whose state should be observed. It can be a class or an instance.

Yields:

  • The block to be executed before the observable’s state is reverted.

Returns:

  • (Integer)

    The object_id of the observable.

Raises:

  • (AlreadyObserved)

    When attempting to observe the same object twice before the block returning.



70
71
72
73
# File 'lib/xavier.rb', line 70

def self.observe(observable, &block)
  @observer ||= Observer.new
  @observer.observe(observable, &block)
end