Sha256: 4ed566fb14233046a3b16ca415405a7ad26fa8b4665747b1b57538506c53924f

Contents?: true

Size: 1.71 KB

Versions: 2

Compression:

Stored size: 1.71 KB

Contents

require 'set'
require 'son_jay/object_model/properties'
require 'son_jay/object_model/property_definition'
require 'son_jay/object_model/properties_definer'

module SonJay
  class ObjectModel
    include ActsAsModel

    class << self

      def properties(&property_initializations)
        @property_initializations = property_initializations
      end

      def property_definitions
        @property_definitions ||= nil
        return @property_definitions if @property_definitions

        definitions = []

        definer = PropertiesDefiner.new(definitions)
        definer.instance_eval &@property_initializations
        @property_definitions = definitions

        validate_model_dependencies!

        definitions.each do |d|
          name = d.name
          class_eval <<-CODE
            def #{name}         ; sonj_content[#{name.inspect}]         ; end
            def #{name}=(value) ; sonj_content[#{name.inspect}] = value ; end
          CODE
        end

        @property_definitions
      end

      private

      def validate_model_dependencies!(dependants=Set.new)
        raise InfiniteRegressError if dependants.include?(self)
        dependants << self
        hard_model_dependencies.each do |d|
          next unless d.respond_to?(:validate_model_dependencies!, true)
          d.send :validate_model_dependencies!, dependants
        end
      end

      def hard_model_dependencies
        property_definitions.map(&:model_class).compact.uniq
      end
    end

    attr_reader :sonj_content

    def initialize
      definitions = self.class.property_definitions
      @sonj_content = ObjectModel::Properties.new( definitions )
    end

    def to_json(*args)
      sonj_content.to_json(*args)
    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
son_jay-0.2.0.alpha lib/son_jay/object_model.rb
son_jay-0.1.1.alpha lib/son_jay/object_model.rb