Sha256: 77bce9e4fc626c433ffbbc3c2eaedcef74807c020616cae00a68aa6d26367e72

Contents?: true

Size: 1.7 KB

Versions: 1

Compression:

Stored size: 1.7 KB

Contents

module CouchRest
  module Mixins
    module DocumentProperties
      
      def self.included(base)
        base.extend(ClassMethods)
      end
      
      module ClassMethods
        # Stores the class properties
        def properties
          @@properties ||= []
        end

        # This is not a thread safe operation, if you have to set new properties at runtime
        # make sure to use a mutex.
        def property(name, options={})
          unless properties.map{|p| p.name}.include?(name.to_s)
            property = CouchRest::Property.new(name, options.delete(:type), options)
            create_property_getter(property) 
            create_property_setter(property) unless property.read_only == true
            properties << property 
          end
        end
        
        protected
          # defines the getter for the property
          def create_property_getter(property)
            meth = property.name
            class_eval <<-EOS
              def #{meth}
                self['#{meth}']
              end
            EOS

            if property.alias
              class_eval <<-EOS
                alias #{property.alias.to_sym} #{meth.to_sym}
              EOS
            end
          end

          # defines the setter for the property
          def create_property_setter(property)
            meth = property.name
            class_eval <<-EOS
              def #{meth}=(value)
                self['#{meth}'] = value
              end
            EOS

            if property.alias
              class_eval <<-EOS
                alias #{property.alias.to_sym}= #{meth.to_sym}=
              EOS
            end
          end
          
      end # module ClassMethods
      
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
derfred-couchrest-0.12.6.3 lib/couchrest/mixins/properties.rb