module Alakazam

Constants

VERSION

Public Instance Methods

add_observer(observer = nil, options = {}, &block) click to toggle source
# File lib/alakazam/alakazam.rb, line 12
def add_observer(observer = nil, options = {}, &block)
  on_change = if options.include? :on_fire
    options[:on_fire]
  elsif options.include? :on_change
    options[:on_change]
  else
    true
  end

  attributes  = options[:attributes] || {}
  methods     = options[:methods   ] || []

  attributes = [attributes] unless attributes.is_a? Array
  methods    = [methods   ] unless methods.is_a?    Array

  attributes.each { |attribute|
    next if not attribute[:var]
    
    self.class.send(:define_method, :"#{attribute[:var]}=") do |val|
      fire!
      notify_observers attribute[:notify]
      instance_eval "@#{attribute[:var]} = #{val}"
    end
  }

  __observers__[block   ] = { on_change: on_change, methods: methods } if block_given?
  __observers__[observer] = { on_change: on_change, methods: methods } if observer
end
Also aliased as: is_observed_by
change!()
Alias for: changed
changed() click to toggle source
# File lib/alakazam/alakazam.rb, line 57
def changed
  @changed = !changed?
end
Also aliased as: change!, fire!
changed=(state) click to toggle source
# File lib/alakazam/alakazam.rb, line 63
def changed=(state)
  @changed = state
end
Also aliased as: fired=
changed?() click to toggle source
# File lib/alakazam/alakazam.rb, line 68
def changed?
  !!@changed
end
Also aliased as: fired?
count_observers() click to toggle source
# File lib/alakazam/alakazam.rb, line 52
def count_observers
  __observers__.length
end
Also aliased as: how_many_observers?
delete_observer(observer) click to toggle source
# File lib/alakazam/alakazam.rb, line 42
def delete_observer(observer)
  __observers__.delete observer
end
Also aliased as: remove_observer
fire(*things)
Alias for: notify_observers
fire!()
Alias for: changed
fired=(state)
Alias for: changed=
fired?()
Alias for: changed?
has_observer?(observer) click to toggle source
# File lib/alakazam/alakazam.rb, line 47
def has_observer?(observer)
  __observers__.include? observer
end
Also aliased as: is_observed_by?
how_many_observers?()
Alias for: count_observers
is_observed_by(observer = nil, options = {}, &block)
Alias for: add_observer
is_observed_by?(observer)
Alias for: has_observer?
notify(*things)
Alias for: notify_observers
notify_observers(*things) click to toggle source
# File lib/alakazam/alakazam.rb, line 73
def notify_observers(*things)
  __observers__.each { |observer, options|
    if !options[:on_change] || changed?
      if options[:methods].any?
        options[:methods].each { |method|
          if observer.respond_to? method
            observer.send method, *things
          elsif observer.singleton_class.respond_to? method
            observer.singleton_class.send method, *things
          end
        }
      elsif observer.respond_to? :update
        observer.update *things
      elsif observer.is_a? Proc
        observer.call   *things
      else
        options[:methods].each { |method|
          observer.send(method, *things) if observer.respond_to? method
        }
      end
    end
  }

  @changed = false
end
Also aliased as: notify, fire
remove_observer(observer)
Alias for: delete_observer

Private Instance Methods

__observers__() click to toggle source
# File lib/alakazam/alakazam.rb, line 102
def __observers__
  @observers ||= {}
end