Sha256: 7a1f209bd6e522304f5cc07966747342b44dd6ef43b67de98cf3aafc54807f04

Contents?: true

Size: 1.8 KB

Versions: 1

Compression:

Stored size: 1.8 KB

Contents

require 'serializer/railtie'
require 'serializer/initializer'

module Serializer  
  
  def self.included(base)
    base.extend ClassMethods
  end
  
  module ClassMethods
    
    # Add serializer to a class.
    #
    # Usage:
    #
    #   has_serialized :settings do |settings|
    #     settings.define :tw_share, default: true, type: :boolean
    #     settings.define :fb_share, default: true, type: :boolean
    #   end
    #
    
    def has_serialized(name, &block)
      serialize name, Hash
      
      initializer = Serializer::Initializer.new
      block.call(initializer)
      
      initializer.each do |method, options|
        
        define_method "#{method}" do
          hash = send(name)
          result = hash[method.to_sym] if hash
          return options[:default] if hash.nil? or result.nil?
          return result
        end
        
        define_method "#{method}?" do
          hash = send(name)
          result = hash[method.to_sym] if hash
          return options[:default] if hash.nil? or result.nil?
          return result
        end
        
        define_method "#{method}=" do |value|
          send("#{name}=", {}) unless send(name)
          hash = send(name)
          
          if options[:type] and value
            case options[:type].to_sym
            when :float   then value = value.to_f if value.respond_to? :to_f
            when :integer then value = value.to_i if value.respond_to? :to_i
            when :string  then value = value.to_str if value.respond_to? :to_str
            when :symbol  then value = value.to_sym if value.respond_to? :to_sym
            when :boolean then value = !value.to_i.zero? if value.respond_to? :to_i
            end
          end
          
          send(name)[method.to_sym] = value
        end
        
      end
    end
    
  end
  
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
serializer-0.0.4 lib/serializer.rb