lib/temple/mixins/engine_dsl.rb in temple-0.7.2 vs lib/temple/mixins/engine_dsl.rb in temple-0.7.3

- old
+ new

@@ -15,68 +15,37 @@ chain_modified! end def remove(name) name = chain_name(name) - found = false - chain.reject! do |i| - if i.first == name - found = true - else - false - end - end - raise "#{name} not found" unless found + raise "#{name} not found" unless chain.reject! {|i| i.first == name } chain_modified! end alias use append def before(name, *args, &block) name = chain_name(name) e = chain_element(args, block) - found, i = false, 0 - while i < chain.size - if chain[i].first == name - found = true - chain.insert(i, e) - i += 2 - else - i += 1 - end - end - raise "#{name} not found" unless found + chain.map! {|f| f.first == name ? [e, f] : [f] }.flatten!(1) + raise "#{name} not found" unless chain.include?(e) chain_modified! end def after(name, *args, &block) name = chain_name(name) e = chain_element(args, block) - found, i = false, 0 - while i < chain.size - if chain[i].first == name - found = true - i += 1 - chain.insert(i, e) - end - i += 1 - end - raise "#{name} not found" unless found + chain.map! {|f| f.first == name ? [f, e] : [f] }.flatten!(1) + raise "#{name} not found" unless chain.include?(e) chain_modified! end def replace(name, *args, &block) name = chain_name(name) e = chain_element(args, block) - found = false - chain.each_with_index do |c, i| - if c.first == name - found = true - chain[i] = e - end - end - raise "#{name} not found" unless found + chain.map! {|f| f.first == name ? e : f } + raise "#{name} not found" unless chain.include?(e) chain_modified! end # Shortcuts to access namespaces { filter: Temple::Filters, @@ -106,34 +75,15 @@ end def chain_proc_constructor(name, filter) raise(ArgumentError, 'Proc or blocks must have arity 0 or 1') if filter.arity > 1 method_name = "FILTER #{name}" - if Class === self - define_method(method_name, &filter) - filter = instance_method(method_name) - if filter.arity == 1 - proc {|engine| filter.bind(engine) } - else - proc do |engine| - f = filter.bind(engine).call - raise 'Constructor must return callable object' unless f.respond_to?(:call) - f - end - end - else - (class << self; self; end).class_eval { define_method(method_name, &filter) } - filter = method(method_name) - proc {|engine| filter } - end + c = Class === self ? self : singleton_class + filter = c.class_eval { define_method(method_name, &filter); instance_method(method_name) } + proc {|engine| filter.arity == 1 ? filter.bind(engine) : filter.bind(engine).call } end - def chain_callable_constructor(filter) - raise(ArgumentError, 'Class or callable argument is required') unless filter.respond_to?(:call) - proc {|engine| filter } - end - def chain_element(args, block) name = args.shift if Class === name filter = name name = filter.name.to_sym @@ -162,10 +112,11 @@ [name, chain_class_constructor(filter, args.first)] else # Other callable argument (e.g. Object of class which implements #call or Method) # The callable has no access to the option hash of the engine. raise(ArgumentError, 'Too many arguments') unless args.empty? - [name, chain_callable_constructor(filter)] + raise(ArgumentError, 'Class or callable argument is required') unless filter.respond_to?(:call) + [name, proc { filter }] end end end end end