module ResourceController::Helpers::CurrentObjects
  protected
    # Used internally to return the model for your resource.  
    #
    def model
      model_name.to_s.camelize.constantize
    end

  
    # Used to fetch the collection for the index method
    #
    # In order to customize the way the collection is fetched, to add something like pagination, for example, override this method.
    #
    def collection
      end_of_association_chain.find(:all)
    end
    
    # Returns the current param.
    # 
    # Defaults to params[:id].
    #
    # Override this method if you'd like to use an alternate param name.
    #
    def param
      params[:id]
    end
  
    # Used to fetch the current member object in all of the singular methods that operate on an existing member.
    #
    # Override this method if you'd like to fetch your objects in some alternate way, like using a permalink.
    #
    # class PostsController < ResourceController::Base
    #   private
    #     def object
    #       @object ||= end_of_association_chain.find_by_permalink(param)
    #     end
    #   end
    #
    def object
      @object ||= end_of_association_chain.find(param)
    end
    
    # Used internally to load the member object in to an instance variable @#{model_name} (i.e. @post)
    #
    def load_object
      instance_variable_set "@#{parent_type}", parent_object if parent?
      instance_variable_set "@#{object_name}", object
    end
    
    # Used internally to load the collection in to an instance variable @#{model_name.pluralize} (i.e. @posts)
    #
    def load_collection
      instance_variable_set "@#{parent_type}", parent_object if parent?
      instance_variable_set "@#{object_name.to_s.pluralize}", collection
    end
  
    # Returns the form params.  Defaults to params[model_name] (i.e. params["post"])
    #
    def object_params
      params["#{object_name}"]
    end
    
    # Builds the object, but doesn't save it, during the new, and create action.
    #
    def build_object
      @object ||= end_of_association_chain.send parent? ? :build : :new, object_params
    end
end
