lib/rom/boot.rb in rom-0.3.1 vs lib/rom/boot.rb in rom-0.4.0
- old
+ new
@@ -1,8 +1,9 @@
require 'rom/boot/dsl'
require 'rom/relation_builder'
require 'rom/reader_builder'
+require 'rom/command_registry'
module ROM
# Exposes DSL for defining schema, relations and mappers
#
@@ -16,10 +17,11 @@
def initialize(repositories)
@repositories = repositories
@schema = {}
@relations = {}
@mappers = []
+ @commands = {}
@adapter_relation_map = {}
@env = nil
end
# Schema definition DSL
@@ -75,10 +77,14 @@
def mappers(&block)
@mappers.concat(DSL.new(self).mappers(&block))
self
end
+ def commands(name, &block)
+ @commands.update(name => DSL.new(self).commands(&block))
+ end
+
# Finalize the setup
#
# @return [Env] frozen env with access to repositories, schema, relations and mappers
#
# @api public
@@ -86,12 +92,13 @@
raise EnvAlreadyFinalizedError if env
schema = load_schema
relations = load_relations(schema)
readers = load_readers(relations)
+ commands = load_commands(relations)
- @env = Env.new(repositories, schema, relations, readers)
+ @env = Env.new(repositories, schema, relations, readers, commands)
end
# @api private
def [](name)
repositories.fetch(name)
@@ -158,9 +165,29 @@
readers = @mappers.each_with_object({}) do |(name, options, block), h|
h[name] = reader_builder.call(name, options, &block)
end
ReaderRegistry.new(readers)
+ end
+
+ def load_commands(relations)
+ return Registry.new unless relations.elements.any?
+
+ commands = @commands.each_with_object({}) do |(name, definitions), h|
+ adapter = adapter_relation_map[name]
+
+ rel_commands = {}
+
+ definitions.each do |command_name, definition|
+ rel_commands[command_name] = adapter.command(
+ command_name, relations[name], definition
+ )
+ end
+
+ h[name] = CommandRegistry.new(rel_commands)
+ end
+
+ Registry.new(commands)
end
end
end