lib/ronin/model/has_authors.rb in ronin-1.1.0 vs lib/ronin/model/has_authors.rb in ronin-1.2.0
- old
+ new
@@ -15,7 +15,97 @@
#
# You should have received a copy of the GNU General Public License
# along with Ronin. If not, see <http://www.gnu.org/licenses/>.
#
-require 'ronin/model/has_authors/class_methods'
-require 'ronin/model/has_authors/has_authors'
+require 'ronin/model'
+require 'ronin/author'
+
+module Ronin
+ module Model
+ #
+ # Adds an `authors` relationship between a model and the {Author} model.
+ #
+ module HasAuthors
+ #
+ # Adds the `authors` relationship and {ClassMethods} to the model.
+ #
+ # @param [Class] base
+ # The model.
+ #
+ # @api semipublic
+ #
+ def self.included(base)
+ base.send :include, Model, InstanceMethods
+ base.send :extend, ClassMethods
+
+ base.module_eval do
+ # The authors associated with the model.
+ has 0..n, :authors, Ronin::Author, :through => DataMapper::Resource
+
+ Ronin::Author.has 0..n, self.relationship_name,
+ :through => DataMapper::Resource,
+ :model => self
+ end
+ end
+
+ #
+ # Class methods that are added when {HasAuthors} is included into a
+ # model.
+ #
+ module ClassMethods
+ #
+ # Finds all resources associated with a given author.
+ #
+ # @param [String] name
+ # The name of the author.
+ #
+ # @return [Array<Model>]
+ # The resources written by the author.
+ #
+ # @api public
+ #
+ def written_by(name)
+ all('authors.name.like' => "%#{name}%")
+ end
+
+ #
+ # Finds all resources associated with a given organization.
+ #
+ # @param [String] name
+ # The name of the organization.
+ #
+ # @return [Array<Model>]
+ # The resources associated with the organization.
+ #
+ # @api public
+ #
+ def written_for(name)
+ all('authors.organization.like' => "%#{name}%")
+ end
+ end
+
+ #
+ # Instance methods that are added when {HasAuthors} is included into a
+ # model.
+ #
+ module InstanceMethods
+ #
+ # Adds a new author to the resource.
+ #
+ # @param [Hash] attributes
+ # Additional attributes to create the new author.
+ #
+ # @example
+ # author :name => 'Anonymous',
+ # :email => 'anon@example.com',
+ # :organization => 'Anonymous LLC'
+ #
+ # @api public
+ #
+ def author(attributes)
+ self.authors.new(attributes)
+ end
+ end
+ end
+ end
+end