lib/meta/route_dsl/application_builder.rb in meta-api-0.0.4 vs lib/meta/route_dsl/application_builder.rb in meta-api-0.0.5
- old
+ new
@@ -8,32 +8,31 @@
class ApplicationBuilder
include MetaBuilder::Delegator
def initialize(prefix = nil, &block)
@mod_prefix = prefix
- @callbacks = { before: [], after: [], around: [] }
+ @callbacks = []
@error_guards = []
@meta_builder = MetaBuilder.new
@mod_builders = []
@shared_mods = []
instance_exec &block if block_given?
end
- def build(parent_path: '', meta: {}, callbacks: {})
+ def build(parent_path: '', meta: {}, callbacks: [])
# 合并 meta 时不仅仅是覆盖,比如 parameters 参数需要合并
meta2 = (meta || {}).merge(@meta_builder.build)
if meta[:parameters] && meta2[:parameters]
meta2[:parameters] = meta[:parameters].merge(meta2[:parameters])
end
# 构建子模块
- callbacks = { # 合并父级传递过来的 callbacks
- before: (callbacks[:before] || []) + @callbacks[:before],
- around: (callbacks[:around] || []) + @callbacks[:around],
- after: @callbacks[:after] + (callbacks[:after] || []),
- }
+ # 合并父级传递过来的 callbacks,将 before 和 around 放在前面,after 放在后面
+ parent_before = callbacks.filter { |cb| cb[:lifecycle] == :before || cb[:lifecycle] == :around }
+ parent_after = callbacks.filter { |cb| cb[:lifecycle] == :after }
+ callbacks = parent_before + @callbacks + parent_after
mods = @mod_builders.map { |builder| builder.build(parent_path: Utils::Path.join(parent_path, @mod_prefix), meta: meta2, callbacks: callbacks) }
Application.new(
prefix: @mod_prefix,
mods: mods,
@@ -64,18 +63,27 @@
@mod_builders << BindingMeta.new(builder, tags ? { tags: tags } : {})
end
# 定义模块内的公共逻辑
def before(&block)
- @callbacks[:before] << block
+ @callbacks << {
+ lifecycle: :before,
+ proc: block
+ }
end
def after(&block)
- @callbacks[:after] << block
+ @callbacks << {
+ lifecycle: :after,
+ proc: block
+ }
end
def around(&block)
- @callbacks[:around] << block
+ @callbacks << {
+ lifecycle: :around,
+ proc: block
+ }
end
def rescue_error(error_class, &block)
@error_guards << { error_class: error_class, caller: block }
end