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 |