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