Module: Mollusk::Filterable

Defined in:
lib/mollusk/filterable.rb

Overview

Extend a class with this module to enable filters

Example:

class Widget

 extend Mollusk::Filterable

 def self.all
   %w( foo bar baz )
 end

 filter :starts_with_b, -> { select { |w| w.chars.first == 'b' } }
 filter :long,          -> { select { |w| w.length > 3 } }
end

Widget.starts_with_b #=> ['bar', 'baz']

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(base) ⇒ Object



19
20
21
22
23
24
# File 'lib/mollusk/filterable.rb', line 19

def self.extended(base)
  define_method(:_mollusk_base_class) { base }
  collection_module =
    Mollusk::Collection.const_set base.name.to_sym, Module.new
  define_method(:_mollusk_collection_module) { collection_module }
end

Instance Method Details

#filter(name, callback) ⇒ Object



26
27
28
29
30
31
32
33
34
35
# File 'lib/mollusk/filterable.rb', line 26

def filter(name, callback)
  _mollusk_collection_module.send :define_method, name, &callback
  define_singleton_method(name) do
    collection = self == _mollusk_base_class ? all : self
    results = collection.instance_exec(&callback)
    mod = _mollusk_collection_module
    (class << results; self end).send :include, mod
    results
  end
end