Sha256: b256feeecf82ac637254397d7662e79b510fdc66f6ec356572510be3adc69578

Contents?: true

Size: 1.82 KB

Versions: 9

Compression:

Stored size: 1.82 KB

Contents

module ActiveTriples
  class PropertyBuilder

    attr_reader :name, :options

    def initialize(name, options, &block)
      @name = name
      @options = options
    end

    def self.create_builder(name, options, &block)
      raise ArgumentError, "property names must be a Symbol" unless
        name.kind_of?(Symbol)

      options[:predicate] = RDF::Resource.new(options[:predicate])
      raise ArgumentError, "must provide an RDF::Resource to :predicate" unless
        options[:predicate].valid?


      new(name, options, &block)
    end

    def self.build(model, name, options, &block)
      builder = create_builder name, options, &block
      reflection = builder.build(&block)
      define_accessors model, reflection, options
      reflection
    end

    def self.define_accessors(model, reflection, options={})
      mixin = model.generated_property_methods
      name = reflection.term
      define_readers(mixin, name)
      define_id_reader(model, name) unless options[:cast] == false
      define_writers(mixin, name)
    end

    def self.define_readers(mixin, name)
      mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
        def #{name}(*args)
          get_values(:#{name})
        end
      CODE
    end

    def self.define_id_reader(mixin, name)
      mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
        def #{name}_ids(*args)
          get_values(:#{name}, :cast => false)
        end
      CODE
    end

    def self.define_writers(mixin, name)
      mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
        def #{name}=(value)
          set_value(:#{name}, value)
        end
      CODE
    end

    def build(&block)
      NodeConfig.new(name,
                     options[:predicate],
                     options.except(:predicate)) do |config|
        config.with_index(&block) if block_given?
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
active-triples-0.7.6 lib/active_triples/property_builder.rb
active-triples-0.7.5 lib/active_triples/property_builder.rb
active-triples-0.7.4 lib/active_triples/property_builder.rb
active-triples-0.7.3 lib/active_triples/property_builder.rb
active-triples-0.7.2 lib/active_triples/property_builder.rb
active-triples-0.7.1 lib/active_triples/property_builder.rb
active-triples-0.8.1 lib/active_triples/property_builder.rb
active-triples-0.8.0 lib/active_triples/property_builder.rb
active-triples-0.7.0 lib/active_triples/property_builder.rb