class apache::mod::peruser (
  $minspareprocessors = '2',
  $minprocessors = '2',
  $maxprocessors = '10',
  $maxclients = '150',
  $maxrequestsperchild = '1000',
  $idletimeout = '120',
  $expiretimeout = '120',
  $keepalive = 'Off',
) {
  include ::apache
  case $::osfamily {
    'freebsd' : {
      fail("Unsupported osfamily ${::osfamily}")
    }
    default: {
      if $::osfamily == 'gentoo' {
        ::portage::makeconf { 'apache2_mpms':
          content => 'peruser',
        }
      }

      if defined(Class['apache::mod::event']) {
        fail('May not include both apache::mod::peruser and apache::mod::event on the same node')
      }
      if defined(Class['apache::mod::itk']) {
        fail('May not include both apache::mod::peruser and apache::mod::itk on the same node')
      }
      if defined(Class['apache::mod::prefork']) {
        fail('May not include both apache::mod::peruser and apache::mod::prefork on the same node')
      }
      if defined(Class['apache::mod::worker']) {
        fail('May not include both apache::mod::peruser and apache::mod::worker on the same node')
      }
      File {
        owner => 'root',
        group => $::apache::params::root_group,
        mode  => $::apache::file_mode,
      }

      $mod_dir = $::apache::mod_dir

      # Template uses:
      # - $minspareprocessors
      # - $minprocessors
      # - $maxprocessors
      # - $maxclients
      # - $maxrequestsperchild
      # - $idletimeout
      # - $expiretimeout
      # - $keepalive
      # - $mod_dir
      file { "${::apache::mod_dir}/peruser.conf":
        ensure  => file,
        mode    => $::apache::file_mode,
        content => template('apache/mod/peruser.conf.erb'),
        require => Exec["mkdir ${::apache::mod_dir}"],
        before  => File[$::apache::mod_dir],
        notify  => Class['apache::service'],
      }
      file { "${::apache::mod_dir}/peruser":
        ensure  => directory,
        require => File[$::apache::mod_dir],
      }
      file { "${::apache::mod_dir}/peruser/multiplexers":
        ensure  => directory,
        require => File["${::apache::mod_dir}/peruser"],
      }
      file { "${::apache::mod_dir}/peruser/processors":
        ensure  => directory,
        require => File["${::apache::mod_dir}/peruser"],
      }

      ::apache::peruser::multiplexer { '01-default': }
    }
  }
}
