module Walruz

  class Config

    # Given a list of classes, it will include the Actor module
    # in each of them.
    #
    # @param [Class] actors The list of classes that will be Actors in the
    # system
    def actors=(actors)
      Array(actors).each do |actor|
        actor.send(:include, Actor)
      end
    end

    # Given a list of classes, it will include the Subject module
    # in each of them.
    #
    # @param [Class] subjects The list of classes that will be Subject in the
    # system
    def subjects=(subjects)
      Array(subjects).each do |subject|
        subject.send(:include, Subject)
      end
    end

    def enable_will_paginate_extension(options = {})
      options = { :include_rails => false }.merge!(options)
      gem 'mislav-will_paginate'
      require 'will_paginate'
      require File.expand_path(
        File.join(File.dirname(__FILE__),  'more', 'pagination')
      )

      safe_include(WillPaginate::Collection,
                   Walruz::More::Pagination::WillPaginateCollection)
      safe_include(Array, Walruz::More::Pagination::Base)

      if options[:include_rails]
        raise LoadError.new("You ask to enable Walruz extensions on \
ActiveRecord::Base, but it was not found. Maybe you should require \
'active_record' first?") unless defined?("ActiveRecord::Base")
        safe_include(::ActiveRecord::Base, Walruz::More::Pagination::Base)
      end
    rescue Gem::LoadError
      raise LoadError.new("You ask to enable Walruz extensions on \
WillPaginate, but it was not found, Maybe you should \
require 'will_paginate' first")
    end

    # Will include the Walruz:CoreExt:Array module
    # to the Array class
    def enable_array_extension
      require File.expand_path(
          File.join(File.dirname(__FILE__), 'core_ext', 'array')
      )
      safe_include(Array, Walruz::CoreExt::Array)
    end

    protected

    def safe_include(base, module_to_include)
      return if base.included_modules.include?(module_to_include)
      base.send(:include, module_to_include)
    end

  end

end