# Accessors and anonymous classes

**URL:** <https://www.ruby-forum.com/t/accessors-and-anonymous-classes/97637>\
**Category:** Ruby\
**Created:** [July 8, 2006, 11:59pm UTC](https://www.ruby-forum.com/t/accessors-and-anonymous-classes/97637 "2006-07-08T23:59:13Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![russellf](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/7bcc69/32.png) [@russellf](https://www.ruby-forum.com/u/russellf)\
**Post date:** [July 8, 2006, 11:59pm UTC](https://www.ruby-forum.com/t/accessors-and-anonymous-classes/97637/1 "2006-07-08T23:59:13Z")

</div>

Hmmm… odd I wrote a version of this last night but it would appear  
that I failed to post it to the forum, doh! so here it goes again. If  
it did get out and this is a duplicate then please accept my apologies  
for the waste of bandwidth.

I am writing a recursive descent parser to parse a configuration file  
that consists of nested ‘Sections’ which all look like this:  
[] {  
  
  
.  
.  
}

where may be another section.

I wrote a clase Section to parse the basic structure. Section.initialise  
calls method specificItems to parse non section items (see below). For  
each type of section I have an anonymous class tied to a Class variable  
– I have included one such class below. I had to make the classes  
anonymous because I needed to include references to the classes in a  
data structure (see subSections ) which tells the parser which section  
types are valid in this section and what to do with them.

[ aside: someone asked why I wanted reference to scalar variable in my  
previous post – this is why. I needed to have a refernce to a variable  
in that structure into which I could store the parsed class]

Now to the problem: As you see I have defined a bunch of accessor  
methods using attr\_reader and attr\_writer, but these don’t work ( I get  
an undefined method error ). Adding the accessor methods explicitly  
works fine. Odd!

I’m not sure if this is a bug, a feature or simply some lack in my  
understanding of how things should work.

Any ideas?

Also this is my first real OO Ruby program and I would appreciate  
comments – it is too large (currently 1000 lines) to post here but if  
anyone would be willing to have a look at it I’d be happy to email it to  
them. My email is removed\_email\_address@domain.invalid.

I have run into various problems in this project and have managed to  
solve all of them but I am far from confident that my solution was the  
best way of doing it. The use of anonymous classes is one example. I  
wrote a generic text parser for this project and because Ruby does not  
support multiple inheiritance I ended up passing an instance of the  
parser as a parameter to all the methods – I figured that since the  
parser needed to maintain state that I could not make it a mixin…

Cheers, Russell

```
@@hostService = Class.new( Section ) {

  attr_reader = :services, :converted, :actions, :patterns, 

```

:realTime,  
:periodic, :files  
attr\_writer = :converted

```
  def initialize( head, parser )
    @services = []
    @actions = []
    @patterns = []
    @realTime = []
    @periodic = []
    @files = []
    @converted = false
    super( head, parser )
  end

```

# accessor methods — since the shorthand way did not work

```
  def actions
    @actions
  end

```

[boring repeditive stuff snipped]

```
  def converted=(value)
    @converted = value
  end

```

# this handles the non section items in the section

```
  def specificItem( firstToken, parser )

    case firstToken
    when 'service'
      if token = parser.expect(/^(\w+)/, "service name") then
        @services.push( token )
      else
        @errors = true
        parser.restofLine # ignore the rest of the line
      end
    else
      @errors = true
      parser.error( "#{firstToken} not valid in host section" )
      parser.restofLine # ignore the rest of the line
    end
 end

```

# defines which sections may be nested within this section

# Key is the section type the vailue is [ ,

# class to parse section and where to store the result ]

```
  def subSections( kind )
    {'actions' => [nil, @@actionList, @actions],
     'files' => [nil, @@commaList, @files],
     'patterns' => [nil, @@patternList, @patterns],
     'realtime' => [nil, @@matchList, @realTime],
     'periodic' => [nil, @@matchList, @periodic]
    }[kind]
  end
} # end of hostSection
```
