class ExpressTemplates::Components::Base

ExpressTemplates::Components::Base is the base class for ExpressTemplates view components.

Subclasses can attach hooks.

An ET component may adopt other capabilities (e.g. support RESTful options).

Constants

MAP

Public Class Methods

abstract_component(value = true) click to toggle source
# File lib/express_templates/components/base.rb, line 29
def self.abstract_component(value = true)
  @is_abstract = value
end
abstract_component?() click to toggle source
# File lib/express_templates/components/base.rb, line 33
def self.abstract_component?
  @is_abstract
end
before_build(proc_or_symbol = nil, exclusive: false, &block) click to toggle source
# File lib/express_templates/components/base.rb, line 90
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
    self.before_build_hooks += [hook]
  end
end
builder_method(name) click to toggle source
# File lib/express_templates/components/base.rb, line 115
def self.builder_method(name)
  builder_method_and_class name, self
end
builder_method_and_class(method_name, klass) click to toggle source

Defines an instance method using Arbre's BuilderMethods

@param String method_name (component)

@param Class klass

# File lib/express_templates/components/base.rb, line 56
      def self.builder_method_and_class(method_name, klass)
        ExpressTemplates::Components::Registry[method_name] = klass
        Arbre::Element::BuilderMethods.class_eval <<-EOF, __FILE__, __LINE__
          def #{method_name}(*args, &block)             # def checkbox(*args, &block)
            insert_tag ::#{klass.name}, *args, &block   #   insert_tag ::Checkbox, *args, &block
          end                                           # end
        EOF
        self.builder_method_name = method_name
      end
contains(proc = nil, &block) click to toggle source
# File lib/express_templates/components/base.rb, line 74
def self.contains(proc = nil, &block)
  define_method(:_build_body, &(proc || block))
end
descendants() click to toggle source
# File lib/express_templates/components/base.rb, line 119
def self.descendants
  ObjectSpace.each_object(Class).select { |klass| klass < self }
end
has_attributes(attribs) click to toggle source

Provide default attributes for the enclosing tag of the component

# File lib/express_templates/components/base.rb, line 85
def self.has_attributes(attribs)
  self._default_classes = attribs.delete(:class)
  _default_attributes.merge!(attribs)
end
inherited(subclass) click to toggle source
# File lib/express_templates/components/base.rb, line 110
def self.inherited(subclass)
  method_name = subclass.to_s.demodulize.underscore
  subclass.builder_method_and_class(method_name, subclass)
end
new(*) click to toggle source
Calls superclass method
# File lib/express_templates/components/base.rb, line 66
def initialize(*)
  super
  _default_attributes.each do |name, value|
    set_attribute(name, value)
  end
  add_class _default_classes
end
require_parent(component) click to toggle source
# File lib/express_templates/components/base.rb, line 42
def self.require_parent(component)
  raise "must pass a sublcass of ExpressTemplates::Components::Base" if !component.kind_of? ExpressTemplates::Components::Base
  @parent_component = component
end
required_parent() click to toggle source
# File lib/express_templates/components/base.rb, line 47
def self.required_parent
  @parent_component
end
tag(tag) click to toggle source

Override the tag_name method for other than <div>

# File lib/express_templates/components/base.rb, line 79
def self.tag(tag)
  define_method(:tag_name) { tag }
end

Private Class Methods

_default_attributes() click to toggle source
# File lib/express_templates/components/base.rb, line 144
def self._default_attributes
  @default_attributes ||= {}
end
_default_classes() click to toggle source
# File lib/express_templates/components/base.rb, line 150
def self._default_classes
  @default_classes ||= ''
end
_default_classes=(classes) click to toggle source
# File lib/express_templates/components/base.rb, line 153
def self._default_classes=(classes)
  @default_classes = classes
end

Public Instance Methods

build(*args, &block) click to toggle source
Calls superclass method
# File lib/express_templates/components/base.rb, line 102
def build(*args, &block)
  _extract_class!(args)
  _run_before_build_hooks
  super(*args) {
    _build_body(&block) if respond_to?(:_build_body)
  }
end

Protected Instance Methods

default_class_name() click to toggle source
# File lib/express_templates/components/base.rb, line 124
def default_class_name
  self.class.name.demodulize.underscore.dasherize
end

Private Instance Methods

_default_attributes() click to toggle source
# File lib/express_templates/components/base.rb, line 141
def _default_attributes
  self.class._default_attributes
end
_default_classes() click to toggle source
# File lib/express_templates/components/base.rb, line 147
def _default_classes
  self.class._default_classes
end
_extract_class!(args) click to toggle source
# File lib/express_templates/components/base.rb, line 138
def _extract_class!(args)
  add_class args.last.delete(:class) if args.last.try(:kind_of?, Hash)
end
_run_before_build_hooks() click to toggle source
# File lib/express_templates/components/base.rb, line 129
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