module Her::Model::Hooks

Her supports hooks/callbacks that are triggered whenever resources are created, updated or destroyed.

@example Defining a hook with a block

class User
  include Her::Model
  before_save { |resource| resource.internal_id = 42 }
end

@example Defining a hook with a method name

class User
  include Her::Model
  before_save :set_internal_id

  private
  def set_internal_id
    self.internal_id = 42
  end
end

Public Instance Methods

after_create(method=nil, &block) click to toggle source

Add a *after create* callback. Triggered after a resource is created. @param [Symbol, &block] method A method or a block to be called

# File lib/her/model/hooks.rb, line 47
def after_create(method=nil, &block); set_hook(:after, :create, method || block); end
after_destroy(method=nil, &block) click to toggle source

Add a *after destroy* callback. Triggered after a resource is destroyed. @param [Symbol, &block] method A method or a block to be called

# File lib/her/model/hooks.rb, line 55
def after_destroy(method=nil, &block); set_hook(:after, :destroy, method || block); end
after_find(method=nil, &block) click to toggle source

Add a *after find* callback. Triggered after a resource is found. @param [Symbol, &block] method A method or a block to be called

# File lib/her/model/hooks.rb, line 59
def after_find(method=nil, &block); set_hook(:after, :find, method || block); end
after_save(method=nil, &block) click to toggle source

Add a *after save* callback. Triggered after a resource is created or updated. @param [Symbol, &block] method A method or a block to be called

# File lib/her/model/hooks.rb, line 43
def after_save(method=nil, &block); set_hook(:after, :save, method || block); end
after_update(method=nil, &block) click to toggle source

Add a *after update* callback. Triggered after a resource is updated. @param [Symbol, &block] method A method or a block to be called

# File lib/her/model/hooks.rb, line 51
def after_update(method=nil, &block); set_hook(:after, :update, method || block); end
before_create(method=nil, &block) click to toggle source

Add a *before create* callback. Triggered before a resource is created. @param [Symbol, &block] method A method or a block to be called

# File lib/her/model/hooks.rb, line 28
def before_create(method=nil, &block); set_hook(:before, :create, method || block); end
before_destroy(method=nil, &block) click to toggle source

Add a *before destroy* callback. Triggered before a resource is destroyed. @param [Symbol, &block] method A method or a block to be called

# File lib/her/model/hooks.rb, line 36
def before_destroy(method=nil, &block); set_hook(:before, :destroy, method || block); end
before_find(method=nil, &block) click to toggle source

Do not add a *before find* callback. Only *after find* is supported.

# File lib/her/model/hooks.rb, line 39
def before_find(method=nil, &block); raise NoMethodError, "undefined method `before_find' for #{self}"; end
before_save(method=nil, &block) click to toggle source

Add a *before save* callback. Triggered before a resource is created or updated. @param [Symbol, &block] method A method or a block to be called

# File lib/her/model/hooks.rb, line 24
def before_save(method=nil, &block); set_hook(:before, :save, method || block); end
before_update(method=nil, &block) click to toggle source

Add a *before update* callback. Triggered before a resource is updated. @param [Symbol, &block] method A method or a block to be called

# File lib/her/model/hooks.rb, line 32
def before_update(method=nil, &block); set_hook(:before, :update, method || block); end
hooks() click to toggle source

@private

# File lib/her/model/hooks.rb, line 70
def hooks
  @her_hooks ||= begin
    if superclass.respond_to?(:hooks)
      superclass.hooks.dup
    else
      {}
    end
  end
end
wrap_in_hooks(resource, *hooks) { |resource, class| ... } click to toggle source

Wrap a block between “before” and “after” hooks @private

# File lib/her/model/hooks.rb, line 63
def wrap_in_hooks(resource, *hooks)
  perform_before_hooks(resource, *hooks)
  yield(resource, resource.class) if block_given?
  perform_after_hooks(resource, *hooks.reverse)
end

Private Instance Methods

perform_after_hooks(resource, *hooks) click to toggle source

Perform “after” hooks on a resource @private

# File lib/her/model/hooks.rb, line 99
def perform_after_hooks(resource, *hooks)
  hooks.each do |hook|
    perform_hook(resource, :after, hook)
  end
end
perform_before_hooks(resource, *hooks) click to toggle source

Perform “before” hooks on a resource @private

# File lib/her/model/hooks.rb, line 107
def perform_before_hooks(resource, *hooks)
  hooks.each do |hook|
    perform_hook(resource, :before, hook)
  end
end
perform_hook(record, time, name) click to toggle source

@private

# File lib/her/model/hooks.rb, line 87
def perform_hook(record, time, name)
  Array(self.hooks["#{time}_#{name}".to_sym]).each do |hook|
    if hook.is_a? Symbol
      record.send(hook)
    else
      hook.call(record)
    end
  end
end
set_hook(time, name, action) click to toggle source

@private

# File lib/her/model/hooks.rb, line 82
def set_hook(time, name, action)
  (self.hooks["#{time}_#{name}".to_sym] ||= []) << action
end