lib/express_templates/components/base.rb in express_templates-0.9.1 vs lib/express_templates/components/base.rb in express_templates-0.9.3

- old
+ new

@@ -10,10 +10,13 @@ # Components::Base is the base class for ExpressTemplates view components. # # class Base < Arbre::Component + class_attribute :before_build_hooks + self.before_build_hooks = [] + def self.builder_method_and_class(method_name, klass) Arbre::Element::BuilderMethods.class_eval <<-EOF, __FILE__, __LINE__ def #{method_name}(*args, &block) insert_tag ::#{klass.name}, *args, &block end @@ -43,36 +46,46 @@ def self.has_attributes(attribs) self._default_classes = attribs.delete(:class) _default_attributes.merge!(attribs) end - def self.before_build(proc_or_symbol = nil, &block) - if proc_or_symbol.kind_of?(Symbol) - define_method(:_before_build) do - self.send(proc_or_symbol) - end + def self.before_build(proc_or_symbol = nil, exclusive: false, &block) + hook = (proc_or_symbol || block) + unless hook.kind_of?(Symbol) or hook.respond_to?(:call) + raise "before_build requires symbol (method_name), proc or block" + end + if exclusive + self.before_build_hooks = [hook] else - define_method(:_before_build, &(proc_or_symbol || block)) + self.before_build_hooks += [hook] end end def build(*args, &block) _extract_class!(args) - _before_build if respond_to?(:_before_build) + _run_before_build_hooks super(*args) { _build_body(&block) if respond_to?(:_build_body) } end def resource helpers.resource end def self.inherited(subclass) - builder_method_and_class subclass.to_s.demodulize.underscore, subclass + builder_method_and_class subclass.builder_method_name, subclass end + def self.builder_method_name + to_s.demodulize.underscore + end + + def builder_method_name + self.class.builder_method_name + end + def self.descendants ObjectSpace.each_object(Class).select { |klass| klass < self } end protected @@ -80,9 +93,18 @@ self.class.name.demodulize.underscore.dasherize end private + def _run_before_build_hooks + before_build_hooks.each do |hook| + if hook.kind_of?(Symbol) + self.send(hook) + else + instance_exec &hook + end + end + end def _extract_class!(args) add_class args.last.delete(:class) if args.last.try(:kind_of?, Hash) end def _default_attributes self.class._default_attributes