# Acts as configuration

This acts_as extension provides the capabilities for transform a string or text column to a configuration variable.

## Installation

gem install acts_as_configuration

### Rails 3 Add in your Gemfile: gem 'acts_as_configuration', :git => 'git://github.com/anga/acts_as_configuration.git'

## Usage

Only you need to add the next line in your model.

acts_as_configuration :configuration

For example:

class User < ActiveRecord::Base
  acts_as_configuration :config
end

Now you can write your configuration like:

user.configuration.private_photos = true
user.configuration.subscribe_to_news = false
user.configuration.perfil_description = ''
user.save

### Columns configuration

You can configurate each column.

#### Set column type

You can set the type of the colum.

class User < ActiveRecord::Base
  acts_as_configuration :config, :columns => {
    :private_photos => {
      :type => :boolean
    }, :age => {
      :type => :get_type
    }, :perfil_description => {
      :type => lambda {
        String
      }
    }, :last_loggin => {
      :type => Time.now.class
    }, :subscribe_to_rss => :get_rss_config
  }

  protected
  def get_type
    Fixnum
  end

  def get_rss_config
    {
      :type => :boolean
    }
  end
end

You can use any class, but if you need use boolean values, you must use :boolean.

#### Set default value

class User < ActiveRecord::Base
  acts_as_configuration :config, :columns => {
    :private_photos => {
      :type => :boolean,
      :default => true
    }, :age => {
      :type => :get_type,
      :default => 1
    }, :perfil_description => {
      :type => lambda {
        String
      },
      :default => :get_default_perfil_description
    }, :last_loggin => {
      :type => Time.now.class,
      :default => lambda {
        self.created_at.time
      }
    }, :subscribe_to_rss => :get_rss_config
  }

  protected
  def get_type
    Fixnum
  end

  def get_rss_config
    {
      :type => :boolean,
      :default => true
    }
  end

  def get_default_perfil_description
    Description.where(:user_id => self.id).default
  end
end

#### Set validation

class User < ActiveRecord::Base
  acts_as_configuration :config, :columns => {
    :private_photos => {
      :type => :boolean,
      :default => true
    }, :age => {
      :type => :get_type,
      :default => 1,
      :validate => lambda {
        |age|
        errors.add :config_age, "You are Matusalén?" if age > 150
        errors.add :config_age, "You're a fetus?" if age <= 0
      }
    }, :perfil_description => {
      :type => lambda {
        String
      },
      :default => :get_default_perfil_description,
      :lambda => :must_not_have_strong_language
    }, :last_loggin => {
      :type => Time.now.class,
      :default => lambda {
        self.created_at.time
      },
      :validate => lambda {
        |time|
        errors.add :config_last_loggin, "You can't loggin in the future" if time > Time.now
      }
    }, :subscribe_to_rss => :get_rss_config
  }

  protected
  STRONG_WORD = [
    #...
  ]

  def get_type
    Fixnum
  end

  def get_rss_config
    {
      :type => :boolean,
      :default => true
    }
  end

  def get_default_perfil_description
    Description.where(:user_id => self.id).default
  end

  def must_not_have_strong_language(desc)
    errors.add :cofig_perfil_description, "You must not have strong language" if desc =~ /(#{STRONG_WORD.join('|')})/
  end
end