module Mexico::Util::FancyContainer

This module contains various helper methods.

Public Instance Methods

add_fancy_container(container_name, p_back_collection_name=nil) click to toggle source

module ClassMethods

# File lib/mexico/util/fancy_container.rb, line 25
def add_fancy_container(container_name, p_back_collection_name=nil)
  back_collection_name = p_back_collection_name.nil? ? "#{container_name.to_s}_container" : p_back_collection_name
  define_method(container_name) do |*args|
    coll = Array.new(instance_variable_get("@#{back_collection_name}"))
    if args.is_a?(Enumerable)
      if args.length==1
        if args.first.is_a?(String)
          # one argument in string form: assume an identifier, return a single object or nil
          return instance_variable_get("@#{back_collection_name}").find{|x| x.identifier == args.first }
        end
        if args.first.is_a?(Hash)
          # one argument in string form: assume a hash with conditions
          args.first.each do |key,val|
            if val.is_a?(String)
              coll.select!{|c| c.send(key).to_s==val }
            elsif val.is_a?(Regexp)
              coll.select!{|c| c.send(key).to_s=~val }
            end
          end
          return coll
        end
        if args.first.is_a?(Integer)
          return coll[args.first]
        end
      end
    end
    # otherwise:
    orig_coll = instance_variable_get("@#{back_collection_name}")
    orig_coll = [] if orig_coll.nil?
    Array.new(orig_coll)
  end
end