module Mollusk::Filterable
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']
Public Class Methods
extended(base)
click to toggle source
# 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
Public Instance Methods
filter(name, callback)
click to toggle source
# 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