class YARD::Tags::AttributeDirective

Defines an attribute with a given name, using indented block data as the attribute’s docstring. If the type specifier is supplied with “r”, “w”, or “rw”, the attribute is made readonly, writeonly or readwrite respectively. A readwrite attribute is the default, if no type is specified. The comment containing this directive does not need to be attached to any source, but if it is, that source code will be used as the method’s source.

To define a regular method, see {tag:!method}

@note This directive should only be used if there is no explicit attr_*

declaration for the attribute in any source files (i.e., the attribute
is declared dynamically via meta-programming). In all other cases, add
documentation to the attribute declaration itself.

@note For backwards compatibility support, you do not need to indent

the attribute's docstring text. If an +@!attribute+ directive is seen with
no indented block, the entire docstring is used as the new attribute's
docstring text.

@example Defining a simple readonly attribute

# @!attribute [r] count
#   @return [Fixnum] the size of the list

@example Defining a simple readwrite attribute

# @!attribute name
#   @return [String] the name of the user

@see tag:!method @since 0.7.0

Public Instance Methods

after_parse() click to toggle source
# File lib/yard/tags/directives.rb, line 462
def after_parse
  return unless handler
  use_indented_text
  create_attribute_data(create_object)
end

Protected Instance Methods

method_name() click to toggle source
# File lib/yard/tags/directives.rb, line 470
def method_name
  name = sanitized_tag_signature || handler.call_params.first
  name += '=' unless readable?
  name
end
method_signature() click to toggle source
# File lib/yard/tags/directives.rb, line 476
def method_signature
  if readable?
    "def #{method_name}"
  else
    "def #{method_name}(value)"
  end
end

Private Instance Methods

create_attribute_data(object) click to toggle source
# File lib/yard/tags/directives.rb, line 486
def create_attribute_data(object)
  return unless object
  clean_name = object.name.to_s.sub(/=$/, '')
  attrs = object.namespace.attributes[object.scope]
  attrs[clean_name] ||= SymbolHash[:read => nil, :write => nil]
  attrs[clean_name][:read] = object if readable?
  if writable?
    if object.name.to_s[-1, 1] == '='
      writer = object
      writer.parameters = [['value', nil]]
    else
      writer = CodeObjects::MethodObject.new(object.namespace,
        object.name.to_s + '=', object.scope)
      writer.signature = "def #{object.name}=(value)"
      writer.visibility = object.visibility
      writer.dynamic = object.dynamic
      writer.source = object.source
      writer.group = object.group
      writer.parameters = [['value', nil]]
      writer.docstring = object.base_docstring
      handler.register_file_info(writer)
    end
    attrs[clean_name][:write] = writer
  end
end
readable?() click to toggle source
# File lib/yard/tags/directives.rb, line 516
def readable?
  !tag.types || tag.types.join =~ /(?!w)r/
end
writable?() click to toggle source
# File lib/yard/tags/directives.rb, line 512
def writable?
  !tag.types || tag.types.join.include?('w')
end