Sha256: 95f85f87e0dfe9648ac8fd37289efa4cf84e6093a1c3ecf81f6ddfdd400a7a52

Contents?: true

Size: 1.48 KB

Versions: 1

Compression:

Stored size: 1.48 KB

Contents

require 'bigdecimal'
require 'time'
require 'date'

module Ohm
  module Types
    class Primitive < BasicObject
      def initialize(value)
        @raw = value
      end

      def to_s
        @raw
      end

      def inspect
        "#<Primitive raw=#{@raw}>"
      end

    protected
      def object
        @raw
      end

      def method_missing(meth, *args, &blk)
        object.send(meth, *args, &blk)
      end
    end

    class String < Primitive
    end

    class Decimal < Primitive
    protected
      def object
        ::Kernel::BigDecimal(@raw)
      end
    end

    class Integer < Primitive
    protected
      def object
        ::Kernel::Integer(@raw)
      end
    end

    class Float < Primitive
    protected
      def object
        ::Kernel::Float(@raw)
      end
    end

    class Time < Primitive
    protected
      def object
        ::Time.parse(@raw)
      end
    end

    class Date < Primitive
    protected
      def object
        ::Date.parse(@raw)
      end
    end
  end
  
  module Typecast
    include Types

    def self.included(base)
      base.extend ClassMethods
    end

    module ClassMethods
      def attribute(name, type = Ohm::Types::String)
        define_method(name) do
          value = read_local(name)
          value && type.new(value)
        end

        define_method(:"#{name}=") do |value|
          write_local(name, value && value.to_s)
        end

        attributes << name unless attributes.include?(name)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ohm-contrib-0.0.10 lib/ohm/contrib/typecast.rb