module RTM::AR
  class Topics < TMSetDelegator
    def wrap(obj)
      Topic.wrap(obj)
    end
  end
  class TopicMapConstructs < TMSetDelegator
    def wrap(obj)
      TopicMapConstruct.wrap(obj)
    end
  end
  class Associations < TMSetDelegator
    def wrap(obj)
      Association.wrap(obj)
    end
  end
  class TopicNames < TMSetDelegator
    def wrap(obj)
      TopicName.wrap(obj)
    end
  end
  class Occurrences < TMSetDelegator
    def wrap(obj)
      Occurrence.wrap(obj)
    end
  end
  class AssociationRoles < TMSetDelegator
    def wrap(obj)
      AssociationRole.wrap(obj)
    end
  end
  class Reifiables < TMSetDelegator
    def wrap(obj)
      TopicMapConstruct.wrap(obj)
    end
  end
  class Variants < TMSetDelegator
    def wrap(obj)
      Variant.wrap(obj)
    end
  end
  class TopicMaps < TMSetDelegator
    def [](obj)
      # support for getting topic_map by base_locator
      if obj.is_a? String
        # return wrap(__getobj__.find { |tm| tm.base_locator == obj })
        return wrap(TMDM::TopicMap.find_by_base_locator(obj))
      end
      # normal index retrieval
      super
    end

    def wrap(obj)
      TopicMap.wrap(obj)
    end
  end
  class Locators < TMSetDelegator
    def [](obj)
      # support for getting locators by reference
      if obj.is_a? String
        return wrap(__getobj__.find { |tm| tm.reference == obj })
      end
      # normal index retrieval
      super
    end
    def wrap(obj)
      return nil unless obj
      return obj if obj.respond_to? :__getobj__
      case obj.class.name
      when "RTM::AR::TMDM::ItemIdentifier"
        ItemIdentifier.wrap(obj)
      when "RTM::AR::TMDM::SubjectIdentifier"
        SubjectIdentifier.wrap(obj)
      when "RTM::AR::TMDM::SubjectLocator"
        SubjectLocator.wrap(obj)        
      else
        Locator.wrap(obj)
      end
    end
  end
  
  class ItemIdentifiers < Locators
    def wrap(obj)
      ItemIdentifier.wrap(obj)
    end      
  end
  class SubjectIdentifiers < Locators
    def wrap(obj)
      SubjectIdentifier.wrap(obj)
    end      
    
  end
  class SubjectLocators < Locators
    def wrap(obj)
      SubjectLocator.wrap(obj)
    end
  end
end