class Foo
  attr_accessor :ignoreme

  # IMPLICIT METHOD!
  # @return [String]
  just_a_method_for :implicit0

  # IMPLICIT METHOD2!
  # @!scope class
  just_a_method_for :implicit1

  # IMPLICIT METHOD3!
  # @!visibility protected
  just_a_method_for :implicit2

  # Not recognized
  just_a_method_for :implicit_invalid

  #
  ## IS NOT RECOGNIZED!
  just_a_method_for :implicit_invalid2

  # @deprecated don't use this
  just_a_method_for :implicit_invalid3

  ##
  # IS RECOGNIZED!
  just_a_method_for 'implicit_valid'

  # @!attribute [r]
  # @return [Numeric] a number
  a_readable_attribute :attr1

  # @!attribute [w]
  a_writable_attribute :attr2, 'bar'

  # @!attribute
  default_attribute :attr3

  # @!attribute custom
  default_attribute :attr4

  # @!method xyz(a, b, c)
  # The foo method
  # @param [String] a
  # @!visibility protected
  # @!scope class
  foo_bar

  # @!macro property
  #   @!method $1(${3-})
  #   A $0 that is awesome.
  #   @param $3 first parameter
  #   @return [$2] the property $1
  property :name, String, :a, :b, :c

  # @!macro property
  property :age, Fixnum, :value

  # This is just for x
  # @!macro [attach] parser
  #   @!method $1(opts = {})
  #   @return NOTHING!
  parser :x

  parser :c_parser

  # Another docstring
  parser :d_parser

  # @!macro [attach] none
  #   @!method none(foo, bar)
  none

  # @!macro something
  #   @!method $1(a, b, c)
  something :qux

  # @!method qux2(a, b, c)
  something

  # @!macro
  #   $1 $2 $3
  def regular_meth(a, b, c) end

  # @!macro [new] different
  #   @!method $2_name(a = 1)

  # @!macro different
  implicit_with_different_method_name :wrong, :right

  # @!scope module
  a_module_function :modfunc1
end

module MyMixin
  # @!macro [attach] special
  #   DSL method $1
  def defined_by_mixin; end
end

class Bar
  parser :x_parser
end

class Baz < Foo
  extend MyMixin
  parser :y_parser
  none { }
  defined_by_mixin :mixin_method
end

# @!method my_other_method
# Docstring for method
method_that_makes_a_method

# @!macro something
foobarbaz :beep

module DSLMethods
  # @macro [attach] dsl_method
  #   Returns $2 for $1
  dsl_method :foo, String
  dsl_method :bar, Integer
end

class AliasTest
  class << self
    # @!macro alias_main
    #   @!method main_$1
    #     Success main_$1
    def main; end

    # TODO: currently unsupported behavior
    # @!macro alias_alt
    #   @!method alias_$1
    #     Success alias_$1
    alias alt main

    alias alt2 main
  end

  alt  :foo1
  alt2 :foo2
end

class DirectiveMethods
  # @!macro with_directive
  #   @!parse
  #     include $1
  def self.attach(x) end

  attach Bar
end
