module <%= domain.name %>

module Domain
  module <%= aggregate.name %>
    class <%= domain_object.name %>
      class Repository
        include Singleton
        def self.save(object)
          instance.save(object)
        end

        def self.fetch(<%= domain_object_name %>)
          instance.fetch(<%= domain_object_name %>)
        end

        def initialize
          @objects = {}
        end

        def self.create(<%= domain_object_name %>)
          instance.create(<%= domain_object_name %>)
        end

        def self.all
          instance.all
        end

        def self.destroy(<%= domain_object_name %>)
          instance.destroy(<%= domain_object_name %>)
        end

        def all
          @objects.values
        end

        def destroy(<%= domain_object_name %>)
          @objects.delete(<%= domain_object_name %>.id)
        end

        def create(<%= domain_object_name %>)
          klass = self.class.const_get(
            self.class.to_s.gsub('::Repository', '')
          )
          domain_object = klass.build(<%= domain_object_name %>)
          domain_object.tap(&:save)
        end

        def fetch(fetchable)
          return @objects[fetchable.id] if fetchable.respond_to?(:id)

          @objects[fetchable]
        end

        def save(<%= domain_object_name %>)
          domain_object = <%= domain_object_name %>
          @objects[<%= domain_object_name %>.hash] = domain_object

          <%= domain_object_name %>.instance_eval do
            @id = <%= domain_object_name %>.hash
          end

          <%= domain_object_name %>
        end
      end
    end
  end
end

end