# Katuv DSL for defining Katuv DSLs

A hand-implemented DSL for defining subsequent DSLs, or at least something for
generating the appropriate classes, would be cool.

# A two-layer approach.

The Katuv classes presently serve a sort of dual responsibility, it'd be ideal
to be able to toss whatever methods we want on there, and have the actual parser
classes not have name collisions or w/e. That is, I should be able to do:

    class KatuvExample
      include Katuv::Node

      terminal Foo

      def foo
        puts "I shadow something from the DSL!"
      end
    end

and be able to still write:

    ex = katuv_example do
      foo "bar"
    end

    ex.foo #=> "I shadow something from the DSL"
    ex.children[Foo] #=> Katuv node

# Various helper methods for nonterminals/multiples

have a `multiple` relationship define a pluralized method which
just does: `children[MultipleRel]` -- if only for convenience

# Katuv DSL for defining Katuv DSLs

A hand-implemented DSL for defining subsequent DSLs, or at least something for
generating the appropriate classes, would be cool.

# A two-layer approach.

The Katuv classes presently serve a sort of dual responsibility, it'd be ideal
to be able to toss whatever methods we want on there, and have the actual parser
classes not have name collisions or w/e. That is, I should be able to do:

    class KatuvExample
      include Katuv::Node

      terminal Foo

      def foo
        puts "I shadow something from the DSL!"
      end
    end

and be able to still write:

    ex = katuv_example do
      foo "bar"
    end

    ex.foo #=> "I shadow something from the DSL"
    ex.children[Foo] #=> Katuv node

# Various helper methods for nonterminals/multiples

have a `multiple` relationship define a pluralized method which
just does: `children[MultipleRel]` -- if only for convenience

# Extract into parts

* katuv-core for the core DSL needed to define the DSL DSL.
* katuv-dsl for the DSL defined by core (this requires katuv-core)
* katuv-bootstrap -- a bootstrapped version of the DSL w/o Core loaded. (use unparse or something)
* midrash -- a katuv dsl for defining whitequark/ast processors
* katuv for the actual DSL-DSL that users-use, pulls in katuv-bootstrap, provides access to katuv-{core,dsl}

Add some ideas about breaking up the project into smaller parts
Add some ideas about breaking up the project into smaller parts