module Icalendar::HasComponents::ClassMethods

def component(singular_name, find_by = :uid, klass = nil)

def component(singular_name, find_by = :uid, klass = nil)
  components = "#{singular_name}s"
  self.components << components
  component_var = "@#{components}"
  define_method components do
    if instance_variable_defined? component_var
      instance_variable_get component_var
    else
      instance_variable_set component_var, []
    end
  end
  define_method singular_name do |c = nil, &block|
    if c.nil?
      c = begin
        klass ||= Icalendar.const_get singular_name.capitalize
        klass.new
      rescue NameError => ne
        Icalendar.logger.warn ne.message
        Component.new singular_name
      end
    end
    add_component c, &block
  end
  define_method "find_#{singular_name}" do |id|
    send(components).find { |c| c.send(find_by) == id }
  end if find_by
  define_method "add_#{singular_name}" do |c|
    send singular_name, c
  end
  define_method "has_#{singular_name}?" do
    !send(components).empty?
  end
end

def components

def components
  @components ||= []
end