Sha256: 56f30bfbaac2ec060e25ea2a8e08c0572729bca3969eefb315a02a398fe3492c

Contents?: true

Size: 1.35 KB

Versions: 1

Compression:

Stored size: 1.35 KB

Contents

module BraintreeRails
  module CollectionAssociation
    module ClassMethods
      def self.extended(receiver)
        receiver.class_eval do
          attr_accessor :collection, :loaded
          lazy_load(Array.public_instance_methods - Object.public_instance_methods)
        end
      end

      def lazy_load(methods)
        methods.each do |method|
          define_method(method) { |*args, &block| load!; super(*args, &block) }
        end
      end
    end

    module InstanceMethods
      def initialize(collection)
        super(self.collection = (collection || []))
      end

      def find(id = nil, &block)
        id.nil? ? super(&block) : super() { |model| model.id == id }
      end

      def build(params = {})
        model_class.new(default_options.merge(params))
      end

      def create(params = {})
        build(params).tap { |model| push(model) if model.save }
      end

      def create!(params = {})
        build(params).tap { |model| push(model) if model.save! }
      end

      def model_class
        self.class.name.singularize.constantize
      end

      def load!
        return if loaded
        self.loaded = true
        __setobj__(collection.map{|model| model_class.new(model)})
      end
    end

    def self.included(receiver)
      receiver.extend         ClassMethods
      receiver.send :include, InstanceMethods
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
braintree-rails-1.1.0 lib/braintree_rails/collection_association.rb