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