Skip to content
Implementation of the Observer pattern in crystal
Crystal
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
spec
src
.gitignore
.travis.yml
LICENSE
README.md
shard.yml

README.md

observable Build Status

Simple implementation of the Observer pattern in Crystal. It is loosely based on the Observable module from Ruby :)

The observer pattern is used to avoid tightly coupling objects that stand in a one-to-many relationship. It allows you to notify dependents about changes that happened to your object, without having hard-coded dependencies :)

Installation

Add to your shard.yml

dependencies:
  observable:
    github: tpei/observable
    branch: master

and then install the library into your project with

$ crystal deps

Usage

Include observable in the class you want to observe:

require "observable/observable"

class ToObserve
  include Observable
end

This provides you with the following methods:

  • add_observer(observer : Observer)
  • changed(state=true)
  • changed?
  • count_observers
  • delete_observer(observer : Observer)
  • delete_observers
  • notify_observers

and as an added bonus, because I dislike the forced changed call precondition:

  • alert_observers, which notifies no matter if changed or not

Then you can include observer in the class you want observing:

require "observable/observer"

class Observing
  include Observer

  def update(observable : Observable)
    # do whatever you want to do if your observable changes
  end
end

This only gives you an update(observable : Observable) method you should override, because it willl raise an error otherwise.

Unfortunately we don't have ruby's verbosity and dynamism here so it's all a little more static. Especially the update method can really only pass on the observable object.

You can’t perform that action at this time.