Sha256: adb38f53e0306a37d47f55246abc3aa5f87e9d480609b8605cc02fa39acf531d

Contents?: true

Size: 1.73 KB

Versions: 3

Compression:

Stored size: 1.73 KB

Contents

module Hobo
  
  class CompositeModel
    
    include ModelSupport
    
    class << self
      
      def find(id)
        ids = id.split('_')
        new(*ids.map_with_index{|id, i| @models[i].constantize.find(id)})
      end
        
      def compose(*models)
        @models = models.map &it.to_s.camelize
        attr_reader *models
        CompositeModel.composites ||= {}
        CompositeModel.composites[@models.sort] = self.name
        
        Hobo.register_model(self)
      end
      
      attr_accessor :composites
      
      attr_reader :models
      
      def new_for(objects)
        classes = objects.map{|o| o.class.name}.sort
        composite_class = CompositeModel.composites[classes].constantize rescue
          (raise ArgumentError, "No composite model for #{classes.inspect}")
        composite_class.new(*objects)
      end
      
    end
      
    
    def initialize(*objects)
      objects.each do |obj|
        raise ArgumentError, "invalid objects for composition: #{objects.inspect}" unless
          obj.class.name.in? self.class.models
        instance_variable_set("@#{obj.class.name.underscore}", obj)
      end
    end
    
    
    def has_hobo_method?(name)
      respond_to?(name)
    end
    
    
    def compose_with(object, use=nil)
      self_classes = use ? use.models : self.class.models
      from_self = (self_classes - [object.class.name]).map {|classname| send(classname.underscore)}
      CompositeModel.new_for(from_self + [object])
    end

    
    def typed_id
      "#{self.class.name.underscore}_#{id}"
    end

    
    def id
      objects = self.class.models.map {|m| instance_variable_get("@#{m.underscore}")}
      objects.*.id.join("_")
    end
    
    alias_method :to_param, :id
      
  end

end
  

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
hobo-0.7.4 hobo_files/plugin/lib/hobo/composite_model.rb
hobo-0.7.3 hobo_files/plugin/lib/hobo/composite_model.rb
hobo-0.7.5 hobo_files/plugin/lib/hobo/composite_model.rb