class Lookbook::CustomTag

def initialize(tag_name, text = nil, *args)

def initialize(tag_name, text = nil, *args)
  tag_definition = Engine.tags.get_tag(tag_name)
  unless tag_definition
    raise ParserError.new "Unknown custom tag type '#{tag_name}'"
  end
  super(tag_name, text.to_s, *args)
  @custom_attributes = Store.new
  @arg_names = tag_definition.options.fetch(:named_args, [])
  @after_parse = tag_definition.options.fetch(:after_parse, nil)
  validate_arg_names
  @tag_args = parse_tag
  @after_parse.call(self) if @after_parse.respond_to?(:call)
end

def method_missing(name, *args)

def method_missing(name, *args)
  if name.end_with? "="
    @custom_attributes[name.to_s.chomp("=")] = args.first
  else
    @custom_attributes.public_send(name, *args) || tag_args[name]
  end
end

def parse_tag

def parse_tag
  text_tokens = Shellwords.split(text)
  values = text_tokens.slice(0, arg_names.size)
  arg_names.map.with_index do |name, i|
    [name.to_sym, values[i]]
  end.to_h
end

def respond_to_missing?(name, include_private)

def respond_to_missing?(name, include_private)
  @custom_attributes.key?(name) || tag_args.key?(name) || super
end

def validate_arg_names

def validate_arg_names
  arg_names.each do |name|
    if methods.include? name.to_sym
      raise ParserError.new "'#{name}' is a reserved word and cannot be used as an argument name."
    end
  end
end