[glibmm/gmmproc-refactor] Regenerate handlers and move them one directory lower.



commit 6a6711bc7355012a5c21f1819b3a9ebac00db579
Author: Krzesimir Nowak <qdlacz gmail com>
Date:   Mon Nov 21 12:47:41 2011 +0100

    Regenerate handlers and move them one directory lower.
    
    No need for `Generated' directory/package name. Also, old subclasses
    of generated files and some Ignore* modules are removed.

 tools/pm/Gir/Handlers/Alias.pm                     |  125 +++++-
 tools/pm/Gir/Handlers/Array.pm                     |  159 ++++++
 .../Handlers/{Generated/Doc.pm => Attribute.pm}    |   61 +--
 tools/pm/Gir/Handlers/Bitfield.pm                  |  160 ++++++-
 tools/pm/Gir/Handlers/{Ignore.pm => CInclude.pm}   |   48 +-
 tools/pm/Gir/Handlers/Callback.pm                  |  159 ++++++-
 tools/pm/Gir/Handlers/Class.pm                     |  425 +++++++++++++++--
 tools/pm/Gir/Handlers/Common/Base.pm               |  150 ++++++
 tools/pm/Gir/Handlers/Common/Misc.pm               |  175 +++++++
 .../pm/Gir/Handlers/{Ignore.pm => Common/State.pm} |   51 ++-
 .../Gir/Handlers/{Generated => }/Common/Store.pm   |    5 +-
 .../pm/Gir/Handlers/{Generated => }/Common/Tags.pm |  248 ++++++----
 tools/pm/Gir/Handlers/Constant.pm                  |  127 +++++-
 tools/pm/Gir/Handlers/Constructor.pm               |  193 ++++++++
 tools/pm/Gir/Handlers/{Ignore.pm => Doc.pm}        |   48 +-
 tools/pm/Gir/Handlers/Enumeration.pm               |  159 ++++++-
 tools/pm/Gir/Handlers/Field.pm                     |  261 ++++++++++
 tools/pm/Gir/Handlers/Function.pm                  |  159 ++++++-
 tools/pm/Gir/Handlers/Generated/Alias.pm           |  161 -------
 tools/pm/Gir/Handlers/Generated/Array.pm           |  118 -----
 tools/pm/Gir/Handlers/Generated/Bitfield.pm        |  161 -------
 tools/pm/Gir/Handlers/Generated/CInclude.pm        |   83 ----
 tools/pm/Gir/Handlers/Generated/Callback.pm        |  204 --------
 tools/pm/Gir/Handlers/Generated/Class.pm           |  505 --------------------
 tools/pm/Gir/Handlers/Generated/Common/Base.pm     |  179 -------
 tools/pm/Gir/Handlers/Generated/Common/Misc.pm     |  116 -----
 tools/pm/Gir/Handlers/Generated/Constant.pm        |  118 -----
 tools/pm/Gir/Handlers/Generated/Constructor.pm     |  204 --------
 tools/pm/Gir/Handlers/Generated/Enumeration.pm     |  204 --------
 tools/pm/Gir/Handlers/Generated/Field.pm           |  204 --------
 tools/pm/Gir/Handlers/Generated/Function.pm        |  204 --------
 tools/pm/Gir/Handlers/Generated/GlibSignal.pm      |  204 --------
 tools/pm/Gir/Handlers/Generated/Implements.pm      |   83 ----
 tools/pm/Gir/Handlers/Generated/Include.pm         |   83 ----
 tools/pm/Gir/Handlers/Generated/Interface.pm       |  376 ---------------
 tools/pm/Gir/Handlers/Generated/Member.pm          |   83 ----
 tools/pm/Gir/Handlers/Generated/Method.pm          |  204 --------
 tools/pm/Gir/Handlers/Generated/Namespace.pm       |  505 --------------------
 tools/pm/Gir/Handlers/Generated/Package.pm         |   83 ----
 tools/pm/Gir/Handlers/Generated/Parameter.pm       |  247 ----------
 tools/pm/Gir/Handlers/Generated/Parameters.pm      |  118 -----
 tools/pm/Gir/Handlers/Generated/Prerequisite.pm    |   83 ----
 tools/pm/Gir/Handlers/Generated/Property.pm        |  204 --------
 tools/pm/Gir/Handlers/Generated/Record.pm          |  333 -------------
 tools/pm/Gir/Handlers/Generated/Repository.pm      |  247 ----------
 tools/pm/Gir/Handlers/Generated/ReturnValue.pm     |  204 --------
 tools/pm/Gir/Handlers/Generated/TopLevel.pm        |  118 -----
 tools/pm/Gir/Handlers/Generated/Type.pm            |  161 -------
 tools/pm/Gir/Handlers/Generated/Union.pm           |  333 -------------
 tools/pm/Gir/Handlers/Generated/Varargs.pm         |   83 ----
 tools/pm/Gir/Handlers/Generated/VirtualMethod.pm   |  204 --------
 tools/pm/Gir/Handlers/GlibBoxed.pm                 |  227 +++++++++
 tools/pm/Gir/Handlers/GlibSignal.pm                |  193 ++++++++
 tools/pm/Gir/Handlers/IgnoreStores.pm              |   23 -
 tools/pm/Gir/Handlers/{Ignore.pm => Implements.pm} |   48 +-
 .../Handlers/{IgnoreStartStore.pm => Include.pm}   |   44 ++-
 tools/pm/Gir/Handlers/Interface.pm                 |  393 ++++++++++++++-
 .../Gir/Handlers/{IgnoreEndStore.pm => Member.pm}  |   44 ++-
 tools/pm/Gir/Handlers/Method.pm                    |  193 ++++++++
 tools/pm/Gir/Handlers/Namespace.pm                 |  377 ++++++++++++++-
 tools/pm/Gir/Handlers/{Ignore.pm => Package.pm}    |   48 +-
 tools/pm/Gir/Handlers/Parameter.pm                 |  227 +++++++++
 tools/pm/Gir/Handlers/Parameters.pm                |   91 ++++
 .../pm/Gir/Handlers/{Ignore.pm => Prerequisite.pm} |   48 +-
 tools/pm/Gir/Handlers/Property.pm                  |  227 +++++++++
 tools/pm/Gir/Handlers/Record.pm                    |  292 +++++++++++-
 tools/pm/Gir/Handlers/Repository.pm                |  168 ++++++--
 tools/pm/Gir/Handlers/ReturnValue.pm               |  227 +++++++++
 tools/pm/Gir/Handlers/TopLevel.pm                  |   61 ++-
 tools/pm/Gir/Handlers/Type.pm                      |  159 ++++++
 tools/pm/Gir/Handlers/Union.pm                     |  292 +++++++++++-
 tools/pm/Gir/Handlers/{Ignore.pm => Varargs.pm}    |   48 +-
 tools/pm/Gir/Handlers/VirtualMethod.pm             |  193 ++++++++
 73 files changed, 5708 insertions(+), 7045 deletions(-)
---
diff --git a/tools/pm/Gir/Handlers/Alias.pm b/tools/pm/Gir/Handlers/Alias.pm
index 555c622..1859291 100644
--- a/tools/pm/Gir/Handlers/Alias.pm
+++ b/tools/pm/Gir/Handlers/Alias.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -20,31 +22,108 @@ package Gir::Handlers::Alias;
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Alias);
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Doc;
+use Gir::Api::Type;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-use Gir::Parser;
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Type;
 
 ##
 ## private:
 ##
-sub _doc_start_impl ($$$)
+sub _attribute_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
 }
 
-sub _type_start_impl ($$$)
+sub _doc_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
 }
 
-sub _setup_subhandlers ($)
+sub _type_start ($$@)
 {
-  my $self = shift;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_type_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Type->new_with_params ($params);
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
+  $state->push_object ($object);
+  $self->_call_start_hooks ('type');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _type_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('type');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_type_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_type ($name, $object);
 }
 
 ##
@@ -54,12 +133,26 @@ sub new ($)
 {
   my $type = shift;
   my $class = (ref ($type) or $type or 'Gir::Handlers::Alias');
-  my $self = $class->SUPER::new ();
-
-  $self->_set_end_ignores
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_start,
+    'doc' => \&_doc_start,
+    'type' => \&_type_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
   ({
-    '*' => undef
+    'attribute' => \&_attribute_end,
+    'doc' => \&_doc_end,
+    'type' => \&_type_end
   });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'doc' => 'Gir::Handlers::Doc',
+    'type' => 'Gir::Handlers::Type'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
   return bless ($self, $class);
 }
 
diff --git a/tools/pm/Gir/Handlers/Array.pm b/tools/pm/Gir/Handlers/Array.pm
new file mode 100644
index 0000000..2abba4e
--- /dev/null
+++ b/tools/pm/Gir/Handlers/Array.pm
@@ -0,0 +1,159 @@
+## This file was generated by taghandlerwriter.pl script.
+##
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::Array;
+
+use strict;
+use warnings;
+
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Array;
+use Gir::Api::Type;
+use Gir::Api::Varargs;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Array;
+use Gir::Handlers::Type;
+use Gir::Handlers::Varargs;
+
+##
+## private:
+##
+sub _array_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_array_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Array->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('array');
+}
+
+sub _type_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_type_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Type->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('type');
+}
+
+sub _varargs_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_varargs_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Varargs->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('varargs');
+}
+
+sub _array_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('array');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_array_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_array ($name, $object);
+}
+
+sub _type_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('type');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_type_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_type ($name, $object);
+}
+
+sub _varargs_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('varargs');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_varargs_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_varargs ($name, $object);
+}
+
+##
+## public:
+##
+sub new ($)
+{
+  my $type = shift;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Array');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'array' => \&_array_start,
+    'type' => \&_type_start,
+    'varargs' => \&_varargs_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'array' => \&_array_end,
+    'type' => \&_type_end,
+    'varargs' => \&_varargs_end
+  });
+  my $subhandlers =
+  {
+    'array' => 'Gir::Handlers::Array',
+    'type' => 'Gir::Handlers::Type',
+    'varargs' => 'Gir::Handlers::Varargs'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
+}
+
+1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Generated/Doc.pm b/tools/pm/Gir/Handlers/Attribute.pm
similarity index 58%
rename from tools/pm/Gir/Handlers/Generated/Doc.pm
rename to tools/pm/Gir/Handlers/Attribute.pm
index 8afbcba..74ffb2c 100644
--- a/tools/pm/Gir/Handlers/Generated/Doc.pm
+++ b/tools/pm/Gir/Handlers/Attribute.pm
@@ -17,65 +17,46 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 ##
 
-package Gir::Handlers::Generated::Doc;
+package Gir::Handlers::Attribute;
 
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Common::Base);
+use parent qw(Gir::Handlers::Common::Base);
 
-use Gir::Handlers::Generated::Common::Store;
-use Gir::Handlers::Generated::Common::Tags;
 
 
-##
-## private virtuals
-##
-
-
-sub _setup_handlers ($)
-{
-  my $self = shift;
-
-  $self->_set_handlers
-  (
-    Gir::Handlers::Generated::Common::Store->new
-    ({
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-    }),
-    Gir::Handlers::Generated::Common::Store->new
-    ({
 
-    })
-  );
-}
-
-sub _setup_subhandlers ($)
-{
-  my $self = shift;
-
-  $self->_set_subhandlers
-  (
-    $self->_generate_subhandlers
-    ([
-
-    ])
-  );
-}
 
 ##
-## private (sort of)
+## private:
 ##
 
 
 ##
-## public
+## public:
 ##
 sub new ($)
 {
   my $type = shift;
-  my $class = (ref ($type) or $type or 'Gir::Handlers::Generated::Doc');
-  my $self = $class->SUPER::new ();
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Attribute');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $subhandlers =
+  {
+
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
 
   return bless ($self, $class);
 }
diff --git a/tools/pm/Gir/Handlers/Bitfield.pm b/tools/pm/Gir/Handlers/Bitfield.pm
index 44fa38c..50979ed 100644
--- a/tools/pm/Gir/Handlers/Bitfield.pm
+++ b/tools/pm/Gir/Handlers/Bitfield.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -20,32 +22,139 @@ package Gir::Handlers::Bitfield;
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Bitfield);
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Doc;
+use Gir::Api::Function;
+use Gir::Api::Member;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-use Gir::Handlers::Ignore;
-use Gir::Parser;
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Function;
+use Gir::Handlers::Member;
 
 ##
 ## private:
 ##
-sub _doc_start_impl ($$$)
+sub _attribute_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
 }
 
-sub _member_start_impl ($$$)
+sub _doc_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
 }
 
-sub _setup_subhandlers ($)
+sub _function_start ($$@)
 {
-  my $self = shift;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_function_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Function->new_with_params ($params);
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
+  $state->push_object ($object);
+  $self->_call_start_hooks ('function');
+}
+
+sub _member_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_member_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Member->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('member');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _function_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('function');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_function_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_function ($name, $object);
+}
+
+sub _member_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('member');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_member_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_member ($name, $object);
 }
 
 ##
@@ -55,12 +164,29 @@ sub new ($)
 {
   my $type = shift;
   my $class = (ref ($type) or $type or 'Gir::Handlers::Bitfield');
-  my $self = $class->SUPER::new ();
-
-  $self->_set_end_ignores
+  my $start_store = Gir::Handlers::Common::Store->new
   ({
-    '*' => undef
+    'attribute' => \&_attribute_start,
+    'doc' => \&_doc_start,
+    'function' => \&_function_start,
+    'member' => \&_member_start
   });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_end,
+    'doc' => \&_doc_end,
+    'function' => \&_function_end,
+    'member' => \&_member_end
+  });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'doc' => 'Gir::Handlers::Doc',
+    'function' => 'Gir::Handlers::Function',
+    'member' => 'Gir::Handlers::Member'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
   return bless ($self, $class);
 }
 
diff --git a/tools/pm/Gir/Handlers/Ignore.pm b/tools/pm/Gir/Handlers/CInclude.pm
similarity index 62%
copy from tools/pm/Gir/Handlers/Ignore.pm
copy to tools/pm/Gir/Handlers/CInclude.pm
index c3a9d4c..79ab9d0 100644
--- a/tools/pm/Gir/Handlers/Ignore.pm
+++ b/tools/pm/Gir/Handlers/CInclude.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -15,35 +17,25 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 ##
 
-package Gir::Handlers::Ignore;
+package Gir::Handlers::CInclude;
 
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Common::Base);
+use parent qw(Gir::Handlers::Common::Base);
 
-use Gir::Handlers::IgnoreStores;
 
-sub _setup_handlers ($)
-{
-  my $self = shift;
 
-  $self->_set_handlers
-  (
-    Gir::Handlers::IgnoreStartStore->new (),
-    Gir::Handlers::IgnoreEndStore->new ()
-  );
-}
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-sub _setup_subhandlers ($)
-{
-  my $self = shift;
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
-}
+
+##
+## private:
+##
+
 
 ##
 ## public:
@@ -51,8 +43,20 @@ sub _setup_subhandlers ($)
 sub new ($)
 {
   my $type = shift;
-  my $class = (ref ($type) or $type or 'Gir::Handlers::Ignore');
-  my $self = $class->SUPER::new ();
+  my $class = (ref ($type) or $type or 'Gir::Handlers::CInclude');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $subhandlers =
+  {
+
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
 
   return bless ($self, $class);
 }
diff --git a/tools/pm/Gir/Handlers/Callback.pm b/tools/pm/Gir/Handlers/Callback.pm
index 11fc43b..77258de 100644
--- a/tools/pm/Gir/Handlers/Callback.pm
+++ b/tools/pm/Gir/Handlers/Callback.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -20,37 +22,139 @@ package Gir::Handlers::Callback;
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Callback);
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Doc;
+use Gir::Api::Parameters;
+use Gir::Api::ReturnValue;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-use Gir::Handlers::Ignore;
-use Gir::Parser;
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Parameters;
+use Gir::Handlers::ReturnValue;
 
 ##
 ## private:
 ##
-sub _doc_start_impl ($$$)
+sub _attribute_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
 }
 
-sub _parameters_start_impl ($$$)
+sub _doc_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
 }
 
-sub _return_value_start_impl ($$$)
+sub _parameters_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_parameters_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Parameters->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('parameters');
 }
 
-sub _setup_subhandlers ($)
+sub _return_value_start ($$@)
 {
-  my $self = shift;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_return_value_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::ReturnValue->new_with_params ($params);
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
+  $state->push_object ($object);
+  $self->_call_start_hooks ('return-value');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _parameters_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('parameters');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_parameters_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_parameters ($name, $object);
+}
+
+sub _return_value_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('return-value');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_return_value_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_return_value ($name, $object);
 }
 
 ##
@@ -60,12 +164,29 @@ sub new ($)
 {
   my $type = shift;
   my $class = (ref ($type) or $type or 'Gir::Handlers::Callback');
-  my $self = $class->SUPER::new ();
-
-  $self->_set_end_ignores
+  my $start_store = Gir::Handlers::Common::Store->new
   ({
-    '*' => undef
+    'attribute' => \&_attribute_start,
+    'doc' => \&_doc_start,
+    'parameters' => \&_parameters_start,
+    'return-value' => \&_return_value_start
   });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_end,
+    'doc' => \&_doc_end,
+    'parameters' => \&_parameters_end,
+    'return-value' => \&_return_value_end
+  });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'doc' => 'Gir::Handlers::Doc',
+    'parameters' => 'Gir::Handlers::Parameters',
+    'return-value' => 'Gir::Handlers::ReturnValue'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
   return bless ($self, $class);
 }
 
diff --git a/tools/pm/Gir/Handlers/Class.pm b/tools/pm/Gir/Handlers/Class.pm
index 9d9f009..1b2c7a8 100644
--- a/tools/pm/Gir/Handlers/Class.pm
+++ b/tools/pm/Gir/Handlers/Class.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -20,67 +22,387 @@ package Gir::Handlers::Class;
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Class);
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Constructor;
+use Gir::Api::Doc;
+use Gir::Api::Field;
+use Gir::Api::Function;
+use Gir::Api::GlibSignal;
+use Gir::Api::Implements;
+use Gir::Api::Method;
+use Gir::Api::Property;
+use Gir::Api::Record;
+use Gir::Api::Union;
+use Gir::Api::VirtualMethod;
 
-use Gir::Handlers::Ignore;
-use Gir::Parser;
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Constructor;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Field;
+use Gir::Handlers::Function;
+use Gir::Handlers::GlibSignal;
+use Gir::Handlers::Implements;
+use Gir::Handlers::Method;
+use Gir::Handlers::Property;
+use Gir::Handlers::Record;
+use Gir::Handlers::Union;
+use Gir::Handlers::VirtualMethod;
 
 ##
 ## private:
 ##
-sub _constructor_start_impl ($$$)
+sub _attribute_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
 }
 
-sub _doc_start_impl ($$$)
+sub _constructor_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_constructor_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Constructor->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('constructor');
 }
 
-sub _field_start_impl ($$$)
+sub _doc_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
 }
 
-sub _function_start_impl ($$$)
+sub _field_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_field_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Field->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('field');
 }
 
-sub _glib_signal_start_impl ($$$)
+sub _function_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_function_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Function->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('function');
 }
 
-sub _implements_start_impl ($$$)
+sub _glib_signal_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_glib_signal_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::GlibSignal->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('glib:signal');
 }
 
-sub _method_start_impl ($$$)
+sub _implements_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_implements_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Implements->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('implements');
 }
 
-sub _property_start_impl ($$$)
+sub _method_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_method_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Method->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('method');
 }
 
-sub _virtual_method_start_impl ($$$)
+sub _property_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_property_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Property->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('property');
 }
 
-sub _setup_subhandlers ($)
+sub _record_start ($$@)
 {
-  my $self = shift;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_record_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Record->new_with_params ($params);
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
+  $state->push_object ($object);
+  $self->_call_start_hooks ('record');
+}
+
+sub _union_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_union_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Union->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('union');
+}
+
+sub _virtual_method_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_virtual_method_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::VirtualMethod->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('virtual-method');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _constructor_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('constructor');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_constructor_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_constructor ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _field_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('field');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_field_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_field ($name, $object);
+}
+
+sub _function_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('function');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_function_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_function ($name, $object);
+}
+
+sub _glib_signal_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('glib:signal');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_glib_signal_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_glib_signal ($name, $object);
+}
+
+sub _implements_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('implements');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_implements_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_implements ($name, $object);
+}
+
+sub _method_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('method');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_method_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_method ($name, $object);
+}
+
+sub _property_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('property');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_property_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_property ($name, $object);
+}
+
+sub _record_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('record');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_record_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_record ($name, $object);
+}
+
+sub _union_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('union');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_union_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_union ($name, $object);
+}
+
+sub _virtual_method_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('virtual-method');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_virtual_method_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_virtual_method ($name, $object);
 }
 
 ##
@@ -90,12 +412,53 @@ sub new ($)
 {
   my $type = shift;
   my $class = (ref ($type) or $type or 'Gir::Handlers::Class');
-  my $self = $class->SUPER::new ();
-
-  $self->_set_end_ignores
+  my $start_store = Gir::Handlers::Common::Store->new
   ({
-    '*' => undef
+    'attribute' => \&_attribute_start,
+    'constructor' => \&_constructor_start,
+    'doc' => \&_doc_start,
+    'field' => \&_field_start,
+    'function' => \&_function_start,
+    'glib:signal' => \&_glib_signal_start,
+    'implements' => \&_implements_start,
+    'method' => \&_method_start,
+    'property' => \&_property_start,
+    'record' => \&_record_start,
+    'union' => \&_union_start,
+    'virtual-method' => \&_virtual_method_start
   });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_end,
+    'constructor' => \&_constructor_end,
+    'doc' => \&_doc_end,
+    'field' => \&_field_end,
+    'function' => \&_function_end,
+    'glib:signal' => \&_glib_signal_end,
+    'implements' => \&_implements_end,
+    'method' => \&_method_end,
+    'property' => \&_property_end,
+    'record' => \&_record_end,
+    'union' => \&_union_end,
+    'virtual-method' => \&_virtual_method_end
+  });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'constructor' => 'Gir::Handlers::Constructor',
+    'doc' => 'Gir::Handlers::Doc',
+    'field' => 'Gir::Handlers::Field',
+    'function' => 'Gir::Handlers::Function',
+    'glib:signal' => 'Gir::Handlers::GlibSignal',
+    'implements' => 'Gir::Handlers::Implements',
+    'method' => 'Gir::Handlers::Method',
+    'property' => 'Gir::Handlers::Property',
+    'record' => 'Gir::Handlers::Record',
+    'union' => 'Gir::Handlers::Union',
+    'virtual-method' => 'Gir::Handlers::VirtualMethod'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
   return bless ($self, $class);
 }
 
diff --git a/tools/pm/Gir/Handlers/Common/Base.pm b/tools/pm/Gir/Handlers/Common/Base.pm
new file mode 100644
index 0000000..36b9600
--- /dev/null
+++ b/tools/pm/Gir/Handlers/Common/Base.pm
@@ -0,0 +1,150 @@
+# -*- mode: perl; perl-indent-level: 2; indent-tabs-mode: nil -*-
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::Common::Base;
+
+use strict;
+use warnings;
+
+use Gir::Handlers::Common::Store;
+
+##
+## protected:
+##
+sub _call_hooks_general ($$$)
+{
+  my ($self, $tag_name, $hooks) = @_;
+
+  if (exists $hooks->{$tag_name})
+  {
+    my $tag_hooks = $hooks->{$tag_name};
+
+    foreach my $pair (@{$tag_hooks})
+    {
+      my $object = $pair->[0];
+      my $hook = $pair->[1];
+
+      if (defined $object)
+      {
+#        print STDERR 'Calling method hook for `' . $tag_name . '\'.' . "\n";
+        $object->$hook;
+      }
+      else
+      {
+#        print STDERR 'Calling function hook for `' . $tag_name . '\'.' . "\n";
+        &{$hook};
+      }
+    }
+  }
+}
+
+sub _call_start_hooks ($$)
+{
+  my ($self, $tag_name) = @_;
+  my $start_hooks = $self->{'start_hooks'};
+
+  $self->_call_hooks_general ($tag_name, $start_hooks);
+}
+
+sub _call_end_hooks ($$)
+{
+  my ($self, $tag_name) = @_;
+  my $end_hooks = $self->{'end_hooks'};
+
+  $self->_call_hooks_general ($tag_name, $end_hooks);
+}
+
+##
+## public:
+##
+sub new ($$$)
+{
+  my ($type, $start_store, $end_store, $subhandlers) = @_;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Common::Base');
+  my $self =
+  {
+    'start_handlers' => $start_store,
+    'end_handlers' => $end_store,
+    'start_hooks' => {},
+    'end_hooks' => {},
+    'subhandlers' => $subhandlers
+  };
+
+  return bless ($self, $class);
+}
+
+sub install_start_hook ($$$$)
+{
+  my ($self, $tag_name, $object, $hook) = @_;
+  my $start_hooks = $self->{'start_hooks'};
+
+  unless (exists $start_hooks->{$tag_name})
+  {
+    $start_hooks->{$tag_name} = [];
+  }
+
+  my $tag_start_hooks = $start_hooks->{$tag_name};
+
+  push @{$tag_start_hooks}, [$object, $hook];
+}
+
+sub install_end_hook ($$$$)
+{
+  my ($self, $tag_name, $object, $hook) = @_;
+  my $end_hooks = $self->{'end_hooks'};
+
+  unless (exists $end_hooks->{$tag_name})
+  {
+    $end_hooks->{$tag_name} = [];
+  }
+
+  my $tag_end_hooks = $end_hooks->{$tag_name};
+
+  push @{$tag_end_hooks}, [$object, $hook];
+}
+
+sub get_start_handlers ($)
+{
+  my $self = shift;
+
+  return $self->{'start_handlers'};
+}
+
+sub get_end_handlers ($)
+{
+  my $self = shift;
+
+  return $self->{'end_handlers'};
+}
+
+sub get_subhandlers_for ($$)
+{
+  my ($self, $elem) = @_;
+  my $subhandlers = $self->{'subhandlers'};
+
+  if (exists ($subhandlers->{$elem}))
+  {
+    my $package = $subhandlers->{$elem};
+    my $instance = $package->new;
+
+    return $instance;
+  }
+  return undef;
+}
+
+1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Common/Misc.pm b/tools/pm/Gir/Handlers/Common/Misc.pm
new file mode 100644
index 0000000..27a0e69
--- /dev/null
+++ b/tools/pm/Gir/Handlers/Common/Misc.pm
@@ -0,0 +1,175 @@
+# -*- mode: perl; perl-indent-level: 2; indent-tabs-mode: nil -*-
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::Common::Misc;
+
+use strict;
+use warnings;
+
+use Gir::Api::Common::Base;
+
+##
+## public:
+##
+
+##
+## Takes an array of mandatory-key->mandatory-value pairs, an array
+## of optional-key->default-value pairs and an array with names and values
+## returned by Expat parser and returns a hash with final key->value pairs. Note
+## that nonexistence of a key in atts_vals array that is specified in mandatory
+## keys array is fatal. Also is existence of a key that is specified in neither
+## mandatory keys array nor optional keys array. Also, if mandatory key has
+## a mandatory value specified then it is fatal when actual value differs from
+## it. If any optional key does not exist in atts_vals array then the one from
+## array of optional-key->default_value pairs is taken.
+##
+sub extract_values($$$)
+{
+  my ($keys, $optional_keys, $atts_vals) = @_;
+  my $params = {};
+  my %check = ();
+  my %leftovers = ();
+  my $leftover = undef;
+  my $att = undef;
+  my $check_value = 0;
+
+  foreach my $pair (@{$keys})
+  {
+    my $key = $pair->[0];
+
+    $params->{$key} = $pair->[1];
+    $check{$key} = undef;
+  }
+  foreach my $pair (@{$optional_keys})
+  {
+    $params->{$pair->[0]} = $pair->[1];
+  }
+
+  foreach my $entry (@{$atts_vals})
+  {
+    if (defined ($leftover))
+    {
+      $leftovers{$leftover} = $entry;
+      $leftover = undef;
+    }
+    elsif (not defined ($att))
+    {
+      if (exists ($params->{$entry}))
+      {
+        $att = $entry;
+        if (exists $check{$att})
+        {
+          delete ($check{$att});
+          $check_value = 1;
+        }
+      }
+      else
+      {
+        $leftover = $entry;
+      }
+    }
+    else
+    {
+      if ($check_value)
+      {
+        $check_value = 0;
+        unless (defined $params->{$att})
+        {
+          $params->{$att} = $entry;
+        }
+        elsif ($params->{$att} ne $entry)
+        {
+          print STDERR 'Expected value `' . $params->{$att} . '\' for `' . $att . '\', got `' . $entry  . '\'.' . "\n";
+          exit 1;
+        }
+      }
+      else
+      {
+        $params->{$att} = $entry;
+      }
+      $att = undef;
+    }
+  }
+
+  my @check_keys = sort keys (%check);
+  my $message = '';
+
+  if (@check_keys > 0)
+  {
+    $message .= 'Missing attributes:' . "\n";
+
+    foreach my $key (@check_keys)
+    {
+      $message .= '  ' . $key . "\n";
+    }
+  }
+
+  my @leftover_keys = sort keys %leftovers;
+
+  if (@leftover_keys > 0)
+  {
+    $message .= 'Leftover attributes:' . "\n";
+
+    foreach $leftover (@leftover_keys)
+    {
+      $message .= "  " . $leftover . " => " . $leftovers{$leftover} . "\n";
+    }
+  }
+
+  if ($message)
+  {
+    # TODO: throw an error.
+    print STDERR $message;
+    exit 1;
+  }
+
+  return $params;
+}
+
+##
+## Takes an object and its index in array. Tries to find out object's name.
+## If it fails, then it just generates a name using given index. This function
+## tries to use (if possible) an original type name - it prefers `GtkWidget'
+## over `Widget' or `gtk_widget_new' over `new'.
+##
+sub get_object_name ($$)
+{
+  my ($object, $index) = @_;
+  my @name_atts =
+  (
+    'c:type',
+    'c:identifier',
+    'glib:type-name',
+    'name',
+    'glib:name'
+  );
+
+  foreach my $name (@name_atts)
+  {
+    if ($object->_has_attribute ($name))
+    {
+      my $object_name = $object->_get_attribute ($name);
+
+      return $object_name if (defined $object_name and $object_name ne '');
+    }
+  }
+
+  return ref ($object) . $index;
+}
+
+1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Ignore.pm b/tools/pm/Gir/Handlers/Common/State.pm
similarity index 60%
copy from tools/pm/Gir/Handlers/Ignore.pm
copy to tools/pm/Gir/Handlers/Common/State.pm
index c3a9d4c..118a237 100644
--- a/tools/pm/Gir/Handlers/Ignore.pm
+++ b/tools/pm/Gir/Handlers/Common/State.pm
@@ -1,3 +1,4 @@
+# -*- mode: perl; perl-indent-level: 2; indent-tabs-mode: nil -*-
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -15,46 +16,50 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 ##
 
-package Gir::Handlers::Ignore;
+package Gir::Handlers::Common::State;
 
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Common::Base);
+use Gir::Api::TopLevel;
 
-use Gir::Handlers::IgnoreStores;
+##
+## public:
+##
+sub new ($$$)
+{
+  my $type = shift;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Common::State');
+  my $self =
+  {
+    'object_stack' => [Gir::Api::TopLevel->new]
+  };
+
+  return bless ($self, $class);
+}
 
-sub _setup_handlers ($)
+sub push_object ($$)
 {
-  my $self = shift;
+  my ($self, $object) = @_;
+  my $object_stack = $self->{'object_stack'};
 
-  $self->_set_handlers
-  (
-    Gir::Handlers::IgnoreStartStore->new (),
-    Gir::Handlers::IgnoreEndStore->new ()
-  );
+  push (@{$object_stack}, $object);
 }
 
-sub _setup_subhandlers ($)
+sub pop_object ($)
 {
   my $self = shift;
+  my $object_stack = $self->{'object_stack'};
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
+  pop (@{$object_stack});
 }
 
-##
-## public:
-##
-sub new ($)
+sub get_current_object ($)
 {
-  my $type = shift;
-  my $class = (ref ($type) or $type or 'Gir::Handlers::Ignore');
-  my $self = $class->SUPER::new ();
+  my $self = shift;
+  my $object_stack = $self->{'object_stack'};
 
-  return bless ($self, $class);
+  return ${object_stack}->[-1];
 }
 
 1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Generated/Common/Store.pm b/tools/pm/Gir/Handlers/Common/Store.pm
similarity index 88%
rename from tools/pm/Gir/Handlers/Generated/Common/Store.pm
rename to tools/pm/Gir/Handlers/Common/Store.pm
index bad52a7..4a507c5 100644
--- a/tools/pm/Gir/Handlers/Generated/Common/Store.pm
+++ b/tools/pm/Gir/Handlers/Common/Store.pm
@@ -1,3 +1,4 @@
+# -*- mode: perl; perl-indent-level: 2; indent-tabs-mode: nil -*-
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -15,7 +16,7 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 ##
 
-package Gir::Handlers::Generated::Common::Store;
+package Gir::Handlers::Common::Store;
 
 use strict;
 use warnings;
@@ -26,7 +27,7 @@ use warnings;
 sub new ($$)
 {
   my ($type, $methods) = @_;
-  my $class = (ref ($type) or $type or 'Gir::Handlers::Stores::Store');
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Common::Store');
   my $self =
   {
     'methods' => $methods
diff --git a/tools/pm/Gir/Handlers/Generated/Common/Tags.pm b/tools/pm/Gir/Handlers/Common/Tags.pm
similarity index 56%
rename from tools/pm/Gir/Handlers/Generated/Common/Tags.pm
rename to tools/pm/Gir/Handlers/Common/Tags.pm
index 8e885f6..ecdc3b4 100644
--- a/tools/pm/Gir/Handlers/Generated/Common/Tags.pm
+++ b/tools/pm/Gir/Handlers/Common/Tags.pm
@@ -17,23 +17,25 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 ##
 
-package Gir::Handlers::Generated::Common::Tags;
+package Gir::Handlers::Common::Tags;
 
 use strict;
 use warnings;
 
-use Gir::Handlers::Generated::Common::Misc;
+use Gir::Handlers::Common::Misc;
 
 sub get_alias_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'c:type',
-      'name'
+      ['name', undef]
     ],
     [
-
+      ['c:type', undef],
+      ['deprecated', undef],
+      ['deprecated-version', undef],
+      ['introspectable', 1]
     ],
     \ _
   );
@@ -42,7 +44,7 @@ sub get_alias_params (@)
 
 sub get_array_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
 
@@ -52,7 +54,23 @@ sub get_array_params (@)
       ['fixed-size', undef],
       ['length', undef],
       ['name', undef],
-      ['zero-terminated', undef]
+      ['zero-terminated', 1]
+    ],
+    \ _
+  );
+}
+
+
+sub get_attribute_params (@)
+{
+  return Gir::Handlers::Common::Misc::extract_values
+  (
+    [
+      ['name', undef],
+      ['value', undef]
+    ],
+    [
+
     ],
     \ _
   );
@@ -61,15 +79,18 @@ sub get_array_params (@)
 
 sub get_bitfield_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'c:type',
-      'name'
+      ['c:type', undef],
+      ['name', undef]
     ],
     [
+      ['deprecated', undef],
+      ['deprecated-version', undef],
       ['glib:get-type', undef],
       ['glib:type-name', undef],
+      ['introspectable', 1],
       ['version', undef]
     ],
     \ _
@@ -79,10 +100,10 @@ sub get_bitfield_params (@)
 
 sub get_c_include_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'name'
+      ['name', undef]
     ],
     [
 
@@ -94,13 +115,15 @@ sub get_c_include_params (@)
 
 sub get_callback_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'name'
+      ['name', undef]
     ],
     [
       ['c:type', undef],
+      ['deprecated', undef],
+      ['deprecated-version', undef],
       ['introspectable', 1],
       ['throws', 0],
       ['version', undef]
@@ -112,19 +135,26 @@ sub get_callback_params (@)
 
 sub get_class_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'c:symbol-prefix',
-      'glib:get-type',
-      'glib:type-name',
-      'name'
+      ['c:symbol-prefix', undef],
+      ['glib:type-name', undef],
+      ['name', undef]
     ],
     [
       ['abstract', 0],
       ['c:type', undef],
+      ['deprecated', undef],
+      ['deprecated-version', undef],
       ['glib:fundamental', 0],
+      ['glib:get-type', undef],
+      ['glib:get-value-func', undef],
+      ['glib:ref-func', undef],
+      ['glib:set-value-func', undef],
       ['glib:type-struct', undef],
+      ['glib:unref-func', undef],
+      ['introspectable', 1],
       ['parent', undef],
       ['version', undef]
     ],
@@ -135,14 +165,15 @@ sub get_class_params (@)
 
 sub get_constant_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'name',
-      'value'
+      ['c:type', undef],
+      ['name', undef],
+      ['value', undef]
     ],
     [
-      ['c:type', undef]
+
     ],
     \ _
   );
@@ -151,16 +182,17 @@ sub get_constant_params (@)
 
 sub get_constructor_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'c:identifier',
-      'name'
+      ['name', undef]
     ],
     [
+      ['c:identifier', undef],
       ['deprecated', undef],
       ['deprecated-version', undef],
       ['introspectable', 1],
+      ['moved-to', undef],
       ['shadowed-by', undef],
       ['shadows', undef],
       ['throws', 0],
@@ -173,10 +205,10 @@ sub get_constructor_params (@)
 
 sub get_doc_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'xml:whitespace'
+      ['xml:whitespace', 'preserve']
     ],
     [
 
@@ -188,11 +220,11 @@ sub get_doc_params (@)
 
 sub get_enumeration_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'c:type',
-      'name'
+      ['c:type', undef],
+      ['name', undef]
     ],
     [
       ['deprecated', undef],
@@ -200,6 +232,7 @@ sub get_enumeration_params (@)
       ['glib:error-domain', undef],
       ['glib:get-type', undef],
       ['glib:type-name', undef],
+      ['introspectable', 1],
       ['version', undef]
     ],
     \ _
@@ -209,13 +242,15 @@ sub get_enumeration_params (@)
 
 sub get_field_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'name'
+      ['name', undef]
     ],
     [
       ['bits', undef],
+      ['deprecated', undef],
+      ['deprecated-version', undef],
       ['introspectable', 1],
       ['private', 0],
       ['readable', 1],
@@ -228,13 +263,13 @@ sub get_field_params (@)
 
 sub get_function_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'c:identifier',
-      'name'
+      ['name', undef]
     ],
     [
+      ['c:identifier', undef],
       ['deprecated', undef],
       ['deprecated-version', undef],
       ['introspectable', 1],
@@ -249,12 +284,29 @@ sub get_function_params (@)
 }
 
 
+sub get_glib_boxed_params (@)
+{
+  return Gir::Handlers::Common::Misc::extract_values
+  (
+    [
+      ['glib:name', undef]
+    ],
+    [
+      ['c:symbol-prefix', undef],
+      ['glib:get-type', undef],
+      ['glib:type-name', undef]
+    ],
+    \ _
+  );
+}
+
+
 sub get_glib_signal_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'name'
+      ['name', undef]
     ],
     [
       ['action', 0],
@@ -274,10 +326,10 @@ sub get_glib_signal_params (@)
 
 sub get_implements_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'name'
+      ['name', undef]
     ],
     [
 
@@ -289,11 +341,11 @@ sub get_implements_params (@)
 
 sub get_include_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'name',
-      'version'
+      ['name', undef],
+      ['version', undef]
     ],
     [
 
@@ -305,17 +357,20 @@ sub get_include_params (@)
 
 sub get_interface_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'c:symbol-prefix',
-      'c:type',
-      'glib:get-type',
-      'glib:type-name',
-      'name'
+      ['c:symbol-prefix', undef],
+      ['glib:type-name', undef],
+      ['name', undef]
     ],
     [
+      ['c:type', undef],
+      ['deprecated', undef],
+      ['deprecated-version', undef],
+      ['glib:get-type', undef],
       ['glib:type-struct', undef],
+      ['introspectable', 1],
       ['version', undef]
     ],
     \ _
@@ -325,12 +380,12 @@ sub get_interface_params (@)
 
 sub get_member_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'c:identifier',
-      'name',
-      'value'
+      ['c:identifier', undef],
+      ['name', undef],
+      ['value', undef]
     ],
     [
       ['glib:nick', undef]
@@ -342,16 +397,17 @@ sub get_member_params (@)
 
 sub get_method_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'c:identifier',
-      'name'
+      ['name', undef]
     ],
     [
+      ['c:identifier', undef],
       ['deprecated', undef],
       ['deprecated-version', undef],
       ['introspectable', 1],
+      ['moved-to', undef],
       ['shadowed-by', undef],
       ['shadows', undef],
       ['throws', 0],
@@ -364,13 +420,13 @@ sub get_method_params (@)
 
 sub get_namespace_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'c:identifier-prefixes',
-      'c:symbol-prefixes',
-      'name',
-      'version'
+      ['c:identifier-prefixes', undef],
+      ['c:symbol-prefixes', undef],
+      ['name', undef],
+      ['version', undef]
     ],
     [
       ['shared-library', undef]
@@ -382,10 +438,10 @@ sub get_namespace_params (@)
 
 sub get_package_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'name'
+      ['name', undef]
     ],
     [
 
@@ -397,19 +453,21 @@ sub get_package_params (@)
 
 sub get_parameter_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'transfer-ownership'
+
     ],
     [
       ['allow-none', 0],
-      ['caller-allocates', undef],
+      ['caller-allocates', 0],
       ['closure', undef],
       ['destroy', undef],
-      ['direction', undef],
+      ['direction', 'in'],
       ['name', undef],
-      ['scope', undef]
+      ['scope', undef],
+      ['skip', 0],
+      ['transfer-ownership', undef]
     ],
     \ _
   );
@@ -418,7 +476,7 @@ sub get_parameter_params (@)
 
 sub get_parameters_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
 
@@ -433,10 +491,10 @@ sub get_parameters_params (@)
 
 sub get_prerequisite_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'name'
+      ['name', undef]
     ],
     [
 
@@ -448,11 +506,11 @@ sub get_prerequisite_params (@)
 
 sub get_property_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'name',
-      'transfer-ownership'
+      ['name', undef],
+      ['transfer-ownership', undef]
     ],
     [
       ['construct', 0],
@@ -471,14 +529,14 @@ sub get_property_params (@)
 
 sub get_record_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'c:type',
-      'name'
+
     ],
     [
       ['c:symbol-prefix', undef],
+      ['c:type', undef],
       ['deprecated', undef],
       ['deprecated-version', undef],
       ['disguised', 0],
@@ -487,6 +545,7 @@ sub get_record_params (@)
       ['glib:is-gtype-struct-for', undef],
       ['glib:type-name', undef],
       ['introspectable', 1],
+      ['name', undef],
       ['version', undef]
     ],
     \ _
@@ -496,15 +555,15 @@ sub get_record_params (@)
 
 sub get_repository_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'version',
-      'xmlns',
-      'xmlns:c'
+      ['version', '1.2'],
+      ['xmlns', 'http://www.gtk.org/introspection/core/1.0'],
+      ['xmlns:c', 'http://www.gtk.org/introspection/c/1.0']
     ],
     [
-      ['xmlns:glib', undef]
+      ['xmlns:glib', 'http://www.gtk.org/introspection/glib/1.0']
     ],
     \ _
   );
@@ -513,12 +572,13 @@ sub get_repository_params (@)
 
 sub get_return_value_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
 
     ],
     [
+      ['skip', 0],
       ['transfer-ownership', undef]
     ],
     \ _
@@ -528,13 +588,14 @@ sub get_return_value_params (@)
 
 sub get_type_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
 
     ],
     [
       ['c:type', undef],
+      ['foreign', 0],
       ['name', undef]
     ],
     \ _
@@ -544,16 +605,21 @@ sub get_type_params (@)
 
 sub get_union_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'name'
+
     ],
     [
       ['c:symbol-prefix', undef],
       ['c:type', undef],
+      ['deprecated', undef],
+      ['deprecated-version', undef],
       ['glib:get-type', undef],
-      ['glib:type-name', undef]
+      ['glib:type-name', undef],
+      ['introspectable', 1],
+      ['name', undef],
+      ['version', undef]
     ],
     \ _
   );
@@ -562,7 +628,7 @@ sub get_union_params (@)
 
 sub get_varargs_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
 
@@ -577,10 +643,10 @@ sub get_varargs_params (@)
 
 sub get_virtual_method_params (@)
 {
-  return Gir::Handlers::Generated::Common::Misc::extract_values
+  return Gir::Handlers::Common::Misc::extract_values
   (
     [
-      'name'
+      ['name', undef]
     ],
     [
       ['deprecated', undef],
diff --git a/tools/pm/Gir/Handlers/Constant.pm b/tools/pm/Gir/Handlers/Constant.pm
index c2d7922..aaebedc 100644
--- a/tools/pm/Gir/Handlers/Constant.pm
+++ b/tools/pm/Gir/Handlers/Constant.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -20,27 +22,108 @@ package Gir::Handlers::Constant;
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Constant);
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Array;
+use Gir::Api::Type;
+use Gir::Api::Varargs;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-use Gir::Handlers::Ignore;
-use Gir::Parser;
+use Gir::Handlers::Array;
+use Gir::Handlers::Type;
+use Gir::Handlers::Varargs;
 
 ##
 ## private:
 ##
-sub _type_start_impl ($$$)
+sub _array_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_array_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Array->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('array');
 }
 
-sub _setup_subhandlers ($)
+sub _type_start ($$@)
 {
-  my $self = shift;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_type_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Type->new_with_params ($params);
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
+  $state->push_object ($object);
+  $self->_call_start_hooks ('type');
+}
+
+sub _varargs_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_varargs_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Varargs->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('varargs');
+}
+
+sub _array_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('array');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_array_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_array ($name, $object);
+}
+
+sub _type_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('type');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_type_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_type ($name, $object);
+}
+
+sub _varargs_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('varargs');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_varargs_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_varargs ($name, $object);
 }
 
 ##
@@ -50,12 +133,26 @@ sub new ($)
 {
   my $type = shift;
   my $class = (ref ($type) or $type or 'Gir::Handlers::Constant');
-  my $self = $class->SUPER::new ();
-
-  $self->_set_end_ignores
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'array' => \&_array_start,
+    'type' => \&_type_start,
+    'varargs' => \&_varargs_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
   ({
-    'type' => undef
+    'array' => \&_array_end,
+    'type' => \&_type_end,
+    'varargs' => \&_varargs_end
   });
+  my $subhandlers =
+  {
+    'array' => 'Gir::Handlers::Array',
+    'type' => 'Gir::Handlers::Type',
+    'varargs' => 'Gir::Handlers::Varargs'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
   return bless ($self, $class);
 }
 
diff --git a/tools/pm/Gir/Handlers/Constructor.pm b/tools/pm/Gir/Handlers/Constructor.pm
new file mode 100644
index 0000000..1363006
--- /dev/null
+++ b/tools/pm/Gir/Handlers/Constructor.pm
@@ -0,0 +1,193 @@
+## This file was generated by taghandlerwriter.pl script.
+##
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::Constructor;
+
+use strict;
+use warnings;
+
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Doc;
+use Gir::Api::Parameters;
+use Gir::Api::ReturnValue;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Parameters;
+use Gir::Handlers::ReturnValue;
+
+##
+## private:
+##
+sub _attribute_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
+}
+
+sub _doc_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
+}
+
+sub _parameters_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_parameters_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Parameters->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('parameters');
+}
+
+sub _return_value_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_return_value_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::ReturnValue->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('return-value');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _parameters_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('parameters');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_parameters_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_parameters ($name, $object);
+}
+
+sub _return_value_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('return-value');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_return_value_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_return_value ($name, $object);
+}
+
+##
+## public:
+##
+sub new ($)
+{
+  my $type = shift;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Constructor');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_start,
+    'doc' => \&_doc_start,
+    'parameters' => \&_parameters_start,
+    'return-value' => \&_return_value_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_end,
+    'doc' => \&_doc_end,
+    'parameters' => \&_parameters_end,
+    'return-value' => \&_return_value_end
+  });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'doc' => 'Gir::Handlers::Doc',
+    'parameters' => 'Gir::Handlers::Parameters',
+    'return-value' => 'Gir::Handlers::ReturnValue'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
+}
+
+1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Ignore.pm b/tools/pm/Gir/Handlers/Doc.pm
similarity index 63%
copy from tools/pm/Gir/Handlers/Ignore.pm
copy to tools/pm/Gir/Handlers/Doc.pm
index c3a9d4c..bf838ea 100644
--- a/tools/pm/Gir/Handlers/Ignore.pm
+++ b/tools/pm/Gir/Handlers/Doc.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -15,35 +17,25 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 ##
 
-package Gir::Handlers::Ignore;
+package Gir::Handlers::Doc;
 
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Common::Base);
+use parent qw(Gir::Handlers::Common::Base);
 
-use Gir::Handlers::IgnoreStores;
 
-sub _setup_handlers ($)
-{
-  my $self = shift;
 
-  $self->_set_handlers
-  (
-    Gir::Handlers::IgnoreStartStore->new (),
-    Gir::Handlers::IgnoreEndStore->new ()
-  );
-}
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-sub _setup_subhandlers ($)
-{
-  my $self = shift;
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
-}
+
+##
+## private:
+##
+
 
 ##
 ## public:
@@ -51,8 +43,20 @@ sub _setup_subhandlers ($)
 sub new ($)
 {
   my $type = shift;
-  my $class = (ref ($type) or $type or 'Gir::Handlers::Ignore');
-  my $self = $class->SUPER::new ();
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Doc');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $subhandlers =
+  {
+
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
 
   return bless ($self, $class);
 }
diff --git a/tools/pm/Gir/Handlers/Enumeration.pm b/tools/pm/Gir/Handlers/Enumeration.pm
index 46a174b..6c0088e 100644
--- a/tools/pm/Gir/Handlers/Enumeration.pm
+++ b/tools/pm/Gir/Handlers/Enumeration.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -20,37 +22,139 @@ package Gir::Handlers::Enumeration;
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Enumeration);
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Doc;
+use Gir::Api::Function;
+use Gir::Api::Member;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-use Gir::Handlers::Ignore;
-use Gir::Parser;
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Function;
+use Gir::Handlers::Member;
 
 ##
 ## private:
 ##
-sub _doc_start_impl ($$$)
+sub _attribute_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
 }
 
-sub _function_start_impl ($$$)
+sub _doc_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
 }
 
-sub _member_start_impl ($$$)
+sub _function_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_function_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Function->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('function');
 }
 
-sub _setup_subhandlers ($)
+sub _member_start ($$@)
 {
-  my $self = shift;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_member_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Member->new_with_params ($params);
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
+  $state->push_object ($object);
+  $self->_call_start_hooks ('member');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _function_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('function');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_function_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_function ($name, $object);
+}
+
+sub _member_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('member');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_member_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_member ($name, $object);
 }
 
 ##
@@ -60,12 +164,29 @@ sub new ($)
 {
   my $type = shift;
   my $class = (ref ($type) or $type or 'Gir::Handlers::Enumeration');
-  my $self = $class->SUPER::new ();
-
-  $self->_set_end_ignores
+  my $start_store = Gir::Handlers::Common::Store->new
   ({
-    '*' => undef
+    'attribute' => \&_attribute_start,
+    'doc' => \&_doc_start,
+    'function' => \&_function_start,
+    'member' => \&_member_start
   });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_end,
+    'doc' => \&_doc_end,
+    'function' => \&_function_end,
+    'member' => \&_member_end
+  });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'doc' => 'Gir::Handlers::Doc',
+    'function' => 'Gir::Handlers::Function',
+    'member' => 'Gir::Handlers::Member'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
   return bless ($self, $class);
 }
 
diff --git a/tools/pm/Gir/Handlers/Field.pm b/tools/pm/Gir/Handlers/Field.pm
new file mode 100644
index 0000000..70531a8
--- /dev/null
+++ b/tools/pm/Gir/Handlers/Field.pm
@@ -0,0 +1,261 @@
+## This file was generated by taghandlerwriter.pl script.
+##
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::Field;
+
+use strict;
+use warnings;
+
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Array;
+use Gir::Api::Attribute;
+use Gir::Api::Callback;
+use Gir::Api::Doc;
+use Gir::Api::Type;
+use Gir::Api::Varargs;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Array;
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Callback;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Type;
+use Gir::Handlers::Varargs;
+
+##
+## private:
+##
+sub _array_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_array_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Array->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('array');
+}
+
+sub _attribute_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
+}
+
+sub _callback_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_callback_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Callback->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('callback');
+}
+
+sub _doc_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
+}
+
+sub _type_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_type_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Type->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('type');
+}
+
+sub _varargs_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_varargs_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Varargs->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('varargs');
+}
+
+sub _array_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('array');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_array_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_array ($name, $object);
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _callback_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('callback');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_callback_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_callback ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _type_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('type');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_type_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_type ($name, $object);
+}
+
+sub _varargs_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('varargs');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_varargs_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_varargs ($name, $object);
+}
+
+##
+## public:
+##
+sub new ($)
+{
+  my $type = shift;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Field');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'array' => \&_array_start,
+    'attribute' => \&_attribute_start,
+    'callback' => \&_callback_start,
+    'doc' => \&_doc_start,
+    'type' => \&_type_start,
+    'varargs' => \&_varargs_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'array' => \&_array_end,
+    'attribute' => \&_attribute_end,
+    'callback' => \&_callback_end,
+    'doc' => \&_doc_end,
+    'type' => \&_type_end,
+    'varargs' => \&_varargs_end
+  });
+  my $subhandlers =
+  {
+    'array' => 'Gir::Handlers::Array',
+    'attribute' => 'Gir::Handlers::Attribute',
+    'callback' => 'Gir::Handlers::Callback',
+    'doc' => 'Gir::Handlers::Doc',
+    'type' => 'Gir::Handlers::Type',
+    'varargs' => 'Gir::Handlers::Varargs'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
+}
+
+1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Function.pm b/tools/pm/Gir/Handlers/Function.pm
index 101f962..1cbefe5 100644
--- a/tools/pm/Gir/Handlers/Function.pm
+++ b/tools/pm/Gir/Handlers/Function.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -20,37 +22,139 @@ package Gir::Handlers::Function;
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Function);
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Doc;
+use Gir::Api::Parameters;
+use Gir::Api::ReturnValue;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-use Gir::Handlers::Ignore;
-use Gir::Parser;
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Parameters;
+use Gir::Handlers::ReturnValue;
 
 ##
 ## private:
 ##
-sub _doc_start_impl ($$$)
+sub _attribute_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
 }
 
-sub _parameters_start_impl ($$$)
+sub _doc_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
 }
 
-sub _return_value_start_impl ($$$)
+sub _parameters_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_parameters_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Parameters->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('parameters');
 }
 
-sub _setup_subhandlers ($)
+sub _return_value_start ($$@)
 {
-  my $self = shift;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_return_value_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::ReturnValue->new_with_params ($params);
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
+  $state->push_object ($object);
+  $self->_call_start_hooks ('return-value');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _parameters_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('parameters');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_parameters_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_parameters ($name, $object);
+}
+
+sub _return_value_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('return-value');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_return_value_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_return_value ($name, $object);
 }
 
 ##
@@ -60,12 +164,29 @@ sub new ($)
 {
   my $type = shift;
   my $class = (ref ($type) or $type or 'Gir::Handlers::Function');
-  my $self = $class->SUPER::new ();
-
-  $self->_set_end_ignores
+  my $start_store = Gir::Handlers::Common::Store->new
   ({
-    '*' => undef
+    'attribute' => \&_attribute_start,
+    'doc' => \&_doc_start,
+    'parameters' => \&_parameters_start,
+    'return-value' => \&_return_value_start
   });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_end,
+    'doc' => \&_doc_end,
+    'parameters' => \&_parameters_end,
+    'return-value' => \&_return_value_end
+  });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'doc' => 'Gir::Handlers::Doc',
+    'parameters' => 'Gir::Handlers::Parameters',
+    'return-value' => 'Gir::Handlers::ReturnValue'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
   return bless ($self, $class);
 }
 
diff --git a/tools/pm/Gir/Handlers/GlibBoxed.pm b/tools/pm/Gir/Handlers/GlibBoxed.pm
new file mode 100644
index 0000000..bde3fef
--- /dev/null
+++ b/tools/pm/Gir/Handlers/GlibBoxed.pm
@@ -0,0 +1,227 @@
+## This file was generated by taghandlerwriter.pl script.
+##
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::GlibBoxed;
+
+use strict;
+use warnings;
+
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Constructor;
+use Gir::Api::Doc;
+use Gir::Api::Function;
+use Gir::Api::Method;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Constructor;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Function;
+use Gir::Handlers::Method;
+
+##
+## private:
+##
+sub _attribute_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
+}
+
+sub _constructor_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_constructor_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Constructor->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('constructor');
+}
+
+sub _doc_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
+}
+
+sub _function_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_function_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Function->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('function');
+}
+
+sub _method_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_method_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Method->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('method');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _constructor_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('constructor');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_constructor_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_constructor ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _function_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('function');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_function_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_function ($name, $object);
+}
+
+sub _method_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('method');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_method_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_method ($name, $object);
+}
+
+##
+## public:
+##
+sub new ($)
+{
+  my $type = shift;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::GlibBoxed');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_start,
+    'constructor' => \&_constructor_start,
+    'doc' => \&_doc_start,
+    'function' => \&_function_start,
+    'method' => \&_method_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_end,
+    'constructor' => \&_constructor_end,
+    'doc' => \&_doc_end,
+    'function' => \&_function_end,
+    'method' => \&_method_end
+  });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'constructor' => 'Gir::Handlers::Constructor',
+    'doc' => 'Gir::Handlers::Doc',
+    'function' => 'Gir::Handlers::Function',
+    'method' => 'Gir::Handlers::Method'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
+}
+
+1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/GlibSignal.pm b/tools/pm/Gir/Handlers/GlibSignal.pm
new file mode 100644
index 0000000..43ced80
--- /dev/null
+++ b/tools/pm/Gir/Handlers/GlibSignal.pm
@@ -0,0 +1,193 @@
+## This file was generated by taghandlerwriter.pl script.
+##
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::GlibSignal;
+
+use strict;
+use warnings;
+
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Doc;
+use Gir::Api::Parameters;
+use Gir::Api::ReturnValue;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Parameters;
+use Gir::Handlers::ReturnValue;
+
+##
+## private:
+##
+sub _attribute_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
+}
+
+sub _doc_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
+}
+
+sub _parameters_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_parameters_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Parameters->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('parameters');
+}
+
+sub _return_value_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_return_value_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::ReturnValue->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('return-value');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _parameters_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('parameters');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_parameters_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_parameters ($name, $object);
+}
+
+sub _return_value_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('return-value');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_return_value_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_return_value ($name, $object);
+}
+
+##
+## public:
+##
+sub new ($)
+{
+  my $type = shift;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::GlibSignal');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_start,
+    'doc' => \&_doc_start,
+    'parameters' => \&_parameters_start,
+    'return-value' => \&_return_value_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_end,
+    'doc' => \&_doc_end,
+    'parameters' => \&_parameters_end,
+    'return-value' => \&_return_value_end
+  });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'doc' => 'Gir::Handlers::Doc',
+    'parameters' => 'Gir::Handlers::Parameters',
+    'return-value' => 'Gir::Handlers::ReturnValue'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
+}
+
+1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Ignore.pm b/tools/pm/Gir/Handlers/Implements.pm
similarity index 62%
copy from tools/pm/Gir/Handlers/Ignore.pm
copy to tools/pm/Gir/Handlers/Implements.pm
index c3a9d4c..c0aa37a 100644
--- a/tools/pm/Gir/Handlers/Ignore.pm
+++ b/tools/pm/Gir/Handlers/Implements.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -15,35 +17,25 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 ##
 
-package Gir::Handlers::Ignore;
+package Gir::Handlers::Implements;
 
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Common::Base);
+use parent qw(Gir::Handlers::Common::Base);
 
-use Gir::Handlers::IgnoreStores;
 
-sub _setup_handlers ($)
-{
-  my $self = shift;
 
-  $self->_set_handlers
-  (
-    Gir::Handlers::IgnoreStartStore->new (),
-    Gir::Handlers::IgnoreEndStore->new ()
-  );
-}
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-sub _setup_subhandlers ($)
-{
-  my $self = shift;
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
-}
+
+##
+## private:
+##
+
 
 ##
 ## public:
@@ -51,8 +43,20 @@ sub _setup_subhandlers ($)
 sub new ($)
 {
   my $type = shift;
-  my $class = (ref ($type) or $type or 'Gir::Handlers::Ignore');
-  my $self = $class->SUPER::new ();
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Implements');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $subhandlers =
+  {
+
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
 
   return bless ($self, $class);
 }
diff --git a/tools/pm/Gir/Handlers/IgnoreStartStore.pm b/tools/pm/Gir/Handlers/Include.pm
similarity index 61%
rename from tools/pm/Gir/Handlers/IgnoreStartStore.pm
rename to tools/pm/Gir/Handlers/Include.pm
index 960d227..53e45d8 100644
--- a/tools/pm/Gir/Handlers/IgnoreStartStore.pm
+++ b/tools/pm/Gir/Handlers/Include.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -15,15 +17,25 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 ##
 
-package Gir::Handlers::IgnoreStartStore;
+package Gir::Handlers::Include;
 
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Common::Store);
+use parent qw(Gir::Handlers::Common::Base);
+
+
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+
+
+##
+## private:
+##
 
-sub start_ignore ($$@)
-{}
 
 ##
 ## public:
@@ -31,20 +43,22 @@ sub start_ignore ($$@)
 sub new ($)
 {
   my $type = shift;
-  my $class = (ref ($type) or $type or 'Gir::Handlers::IgnoreStartStore');
-  my $self = $class->SUPER::new ({});
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Include');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
 
-  return bless ($self, $class);
-}
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
 
-sub has_method_for ($$)
-{
-  return 1;
-}
+  });
+  my $subhandlers =
+  {
 
-sub get_method_for ($$)
-{
-  return \&start_ignore;
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
 }
 
 1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Interface.pm b/tools/pm/Gir/Handlers/Interface.pm
index f814273..4c89ad3 100644
--- a/tools/pm/Gir/Handlers/Interface.pm
+++ b/tools/pm/Gir/Handlers/Interface.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -20,57 +22,356 @@ package Gir::Handlers::Interface;
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Interface);
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Doc;
+use Gir::Api::Field;
+use Gir::Api::Function;
+use Gir::Api::GlibSignal;
+use Gir::Api::Method;
+use Gir::Api::Prerequisite;
+use Gir::Api::Property;
+use Gir::Api::Record;
+use Gir::Api::Union;
+use Gir::Api::VirtualMethod;
 
-use Gir::Handlers::Ignore;
-use Gir::Parser;
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Field;
+use Gir::Handlers::Function;
+use Gir::Handlers::GlibSignal;
+use Gir::Handlers::Method;
+use Gir::Handlers::Prerequisite;
+use Gir::Handlers::Property;
+use Gir::Handlers::Record;
+use Gir::Handlers::Union;
+use Gir::Handlers::VirtualMethod;
 
 ##
 ## private:
 ##
-sub _doc_start_impl ($$$)
+sub _attribute_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
 }
 
-sub _function_start_impl ($$$)
+sub _doc_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
 }
 
-sub _glib_signal_start_impl ($$$)
+sub _field_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_field_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Field->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('field');
 }
 
-sub _method_start_impl ($$$)
+sub _function_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_function_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Function->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('function');
 }
 
-sub _prerequisite_start_impl ($$$)
+sub _glib_signal_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_glib_signal_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::GlibSignal->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('glib:signal');
 }
 
-sub _property_start_impl ($$$)
+sub _method_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_method_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Method->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('method');
 }
 
-sub _virtual_method_start_impl ($$$)
+sub _prerequisite_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_prerequisite_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Prerequisite->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('prerequisite');
 }
 
-sub _setup_subhandlers ($)
+sub _property_start ($$@)
 {
-  my $self = shift;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_property_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Property->new_with_params ($params);
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
+  $state->push_object ($object);
+  $self->_call_start_hooks ('property');
+}
+
+sub _record_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_record_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Record->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('record');
+}
+
+sub _union_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_union_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Union->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('union');
+}
+
+sub _virtual_method_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_virtual_method_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::VirtualMethod->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('virtual-method');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _field_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('field');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_field_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_field ($name, $object);
+}
+
+sub _function_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('function');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_function_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_function ($name, $object);
+}
+
+sub _glib_signal_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('glib:signal');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_glib_signal_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_glib_signal ($name, $object);
+}
+
+sub _method_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('method');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_method_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_method ($name, $object);
+}
+
+sub _prerequisite_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('prerequisite');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_prerequisite_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_prerequisite ($name, $object);
+}
+
+sub _property_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('property');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_property_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_property ($name, $object);
+}
+
+sub _record_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('record');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_record_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_record ($name, $object);
+}
+
+sub _union_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('union');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_union_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_union ($name, $object);
+}
+
+sub _virtual_method_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('virtual-method');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_virtual_method_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_virtual_method ($name, $object);
 }
 
 ##
@@ -80,12 +381,50 @@ sub new ($)
 {
   my $type = shift;
   my $class = (ref ($type) or $type or 'Gir::Handlers::Interface');
-  my $self = $class->SUPER::new ();
-
-  $self->_set_end_ignores
+  my $start_store = Gir::Handlers::Common::Store->new
   ({
-    '*' => undef
+    'attribute' => \&_attribute_start,
+    'doc' => \&_doc_start,
+    'field' => \&_field_start,
+    'function' => \&_function_start,
+    'glib:signal' => \&_glib_signal_start,
+    'method' => \&_method_start,
+    'prerequisite' => \&_prerequisite_start,
+    'property' => \&_property_start,
+    'record' => \&_record_start,
+    'union' => \&_union_start,
+    'virtual-method' => \&_virtual_method_start
   });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_end,
+    'doc' => \&_doc_end,
+    'field' => \&_field_end,
+    'function' => \&_function_end,
+    'glib:signal' => \&_glib_signal_end,
+    'method' => \&_method_end,
+    'prerequisite' => \&_prerequisite_end,
+    'property' => \&_property_end,
+    'record' => \&_record_end,
+    'union' => \&_union_end,
+    'virtual-method' => \&_virtual_method_end
+  });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'doc' => 'Gir::Handlers::Doc',
+    'field' => 'Gir::Handlers::Field',
+    'function' => 'Gir::Handlers::Function',
+    'glib:signal' => 'Gir::Handlers::GlibSignal',
+    'method' => 'Gir::Handlers::Method',
+    'prerequisite' => 'Gir::Handlers::Prerequisite',
+    'property' => 'Gir::Handlers::Property',
+    'record' => 'Gir::Handlers::Record',
+    'union' => 'Gir::Handlers::Union',
+    'virtual-method' => 'Gir::Handlers::VirtualMethod'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
   return bless ($self, $class);
 }
 
diff --git a/tools/pm/Gir/Handlers/IgnoreEndStore.pm b/tools/pm/Gir/Handlers/Member.pm
similarity index 61%
rename from tools/pm/Gir/Handlers/IgnoreEndStore.pm
rename to tools/pm/Gir/Handlers/Member.pm
index a2eedd9..0a5a849 100644
--- a/tools/pm/Gir/Handlers/IgnoreEndStore.pm
+++ b/tools/pm/Gir/Handlers/Member.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -15,15 +17,25 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 ##
 
-package Gir::Handlers::IgnoreEndStore;
+package Gir::Handlers::Member;
 
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Common::Store);
+use parent qw(Gir::Handlers::Common::Base);
+
+
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+
+
+##
+## private:
+##
 
-sub end_ignore ($$)
-{}
 
 ##
 ## public:
@@ -31,20 +43,22 @@ sub end_ignore ($$)
 sub new ($)
 {
   my $type = shift;
-  my $class = (ref ($type) or $type or 'Gir::Handlers::IgnoreEndStore');
-  my $self = $class->SUPER::new ({});
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Member');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
 
-  return bless ($self, $class);
-}
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
 
-sub has_method_for ($$)
-{
-  return 1;
-}
+  });
+  my $subhandlers =
+  {
 
-sub get_method_for ($$)
-{
-  return \&end_ignore;
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
 }
 
 1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Method.pm b/tools/pm/Gir/Handlers/Method.pm
new file mode 100644
index 0000000..9208560
--- /dev/null
+++ b/tools/pm/Gir/Handlers/Method.pm
@@ -0,0 +1,193 @@
+## This file was generated by taghandlerwriter.pl script.
+##
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::Method;
+
+use strict;
+use warnings;
+
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Doc;
+use Gir::Api::Parameters;
+use Gir::Api::ReturnValue;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Parameters;
+use Gir::Handlers::ReturnValue;
+
+##
+## private:
+##
+sub _attribute_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
+}
+
+sub _doc_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
+}
+
+sub _parameters_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_parameters_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Parameters->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('parameters');
+}
+
+sub _return_value_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_return_value_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::ReturnValue->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('return-value');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _parameters_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('parameters');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_parameters_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_parameters ($name, $object);
+}
+
+sub _return_value_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('return-value');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_return_value_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_return_value ($name, $object);
+}
+
+##
+## public:
+##
+sub new ($)
+{
+  my $type = shift;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Method');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_start,
+    'doc' => \&_doc_start,
+    'parameters' => \&_parameters_start,
+    'return-value' => \&_return_value_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_end,
+    'doc' => \&_doc_end,
+    'parameters' => \&_parameters_end,
+    'return-value' => \&_return_value_end
+  });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'doc' => 'Gir::Handlers::Doc',
+    'parameters' => 'Gir::Handlers::Parameters',
+    'return-value' => 'Gir::Handlers::ReturnValue'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
+}
+
+1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Namespace.pm b/tools/pm/Gir/Handlers/Namespace.pm
index e0364a0..1e0d2f2 100644
--- a/tools/pm/Gir/Handlers/Namespace.pm
+++ b/tools/pm/Gir/Handlers/Namespace.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -20,7 +22,23 @@ package Gir::Handlers::Namespace;
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Namespace);
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Alias;
+use Gir::Api::Bitfield;
+use Gir::Api::Callback;
+use Gir::Api::Class;
+use Gir::Api::Constant;
+use Gir::Api::Enumeration;
+use Gir::Api::Function;
+use Gir::Api::GlibBoxed;
+use Gir::Api::Interface;
+use Gir::Api::Record;
+use Gir::Api::Union;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
 use Gir::Handlers::Alias;
 use Gir::Handlers::Bitfield;
@@ -29,62 +47,331 @@ use Gir::Handlers::Class;
 use Gir::Handlers::Constant;
 use Gir::Handlers::Enumeration;
 use Gir::Handlers::Function;
+use Gir::Handlers::GlibBoxed;
 use Gir::Handlers::Interface;
 use Gir::Handlers::Record;
 use Gir::Handlers::Union;
-use Gir::Parser;
 
 ##
 ## private:
 ##
-sub _alias_start_impl ($$$)
+sub _alias_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_alias_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Alias->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('alias');
+}
+
+sub _bitfield_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_bitfield_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Bitfield->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('bitfield');
 }
 
-sub _bitfield_start_impl ($$$)
+sub _callback_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_callback_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Callback->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('callback');
 }
 
-sub _callback_start_impl ($$$)
+sub _class_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_class_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Class->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('class');
+}
+
+sub _constant_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_constant_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Constant->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('constant');
 }
 
-sub _class_start_impl ($$$)
+sub _enumeration_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_enumeration_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Enumeration->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('enumeration');
 }
 
-sub _constant_start_impl ($$$)
+sub _function_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_function_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Function->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('function');
 }
 
-sub _enumeration_start_impl ($$$)
+sub _glib_boxed_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_glib_boxed_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::GlibBoxed->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('glib:boxed');
 }
 
-sub _function_start_impl ($$$)
+sub _interface_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_interface_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Interface->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('interface');
 }
 
-sub _interface_start_impl ($$$)
+sub _record_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_record_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Record->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('record');
 }
 
-sub _record_start_impl ($$$)
+sub _union_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_union_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Union->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('union');
 }
 
-sub _union_start_impl ($$$)
+sub _alias_end ($$)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('alias');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_alias_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_alias ($name, $object);
+}
+
+sub _bitfield_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('bitfield');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_bitfield_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_bitfield ($name, $object);
+}
+
+sub _callback_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('callback');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_callback_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_callback ($name, $object);
+}
+
+sub _class_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('class');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_class_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_class ($name, $object);
+}
+
+sub _constant_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('constant');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_constant_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_constant ($name, $object);
+}
+
+sub _enumeration_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('enumeration');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_enumeration_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_enumeration ($name, $object);
+}
+
+sub _function_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('function');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_function_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_function ($name, $object);
+}
+
+sub _glib_boxed_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('glib:boxed');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_glib_boxed_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_glib_boxed ($name, $object);
+}
+
+sub _interface_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('interface');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_interface_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_interface ($name, $object);
+}
+
+sub _record_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('record');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_record_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_record ($name, $object);
+}
+
+sub _union_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('union');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_union_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_union ($name, $object);
 }
 
 ##
@@ -94,12 +381,50 @@ sub new ($)
 {
   my $type = shift;
   my $class = (ref ($type) or $type or 'Gir::Handlers::Namespace');
-  my $self = $class->SUPER::new ();
-
-  $self->_set_end_ignores
+  my $start_store = Gir::Handlers::Common::Store->new
   ({
-    '*' => undef
+    'alias' => \&_alias_start,
+    'bitfield' => \&_bitfield_start,
+    'callback' => \&_callback_start,
+    'class' => \&_class_start,
+    'constant' => \&_constant_start,
+    'enumeration' => \&_enumeration_start,
+    'function' => \&_function_start,
+    'glib:boxed' => \&_glib_boxed_start,
+    'interface' => \&_interface_start,
+    'record' => \&_record_start,
+    'union' => \&_union_start
   });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'alias' => \&_alias_end,
+    'bitfield' => \&_bitfield_end,
+    'callback' => \&_callback_end,
+    'class' => \&_class_end,
+    'constant' => \&_constant_end,
+    'enumeration' => \&_enumeration_end,
+    'function' => \&_function_end,
+    'glib:boxed' => \&_glib_boxed_end,
+    'interface' => \&_interface_end,
+    'record' => \&_record_end,
+    'union' => \&_union_end
+  });
+  my $subhandlers =
+  {
+    'alias' => 'Gir::Handlers::Alias',
+    'bitfield' => 'Gir::Handlers::Bitfield',
+    'callback' => 'Gir::Handlers::Callback',
+    'class' => 'Gir::Handlers::Class',
+    'constant' => 'Gir::Handlers::Constant',
+    'enumeration' => 'Gir::Handlers::Enumeration',
+    'function' => 'Gir::Handlers::Function',
+    'glib:boxed' => 'Gir::Handlers::GlibBoxed',
+    'interface' => 'Gir::Handlers::Interface',
+    'record' => 'Gir::Handlers::Record',
+    'union' => 'Gir::Handlers::Union'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
   return bless ($self, $class);
 }
 
diff --git a/tools/pm/Gir/Handlers/Ignore.pm b/tools/pm/Gir/Handlers/Package.pm
similarity index 62%
copy from tools/pm/Gir/Handlers/Ignore.pm
copy to tools/pm/Gir/Handlers/Package.pm
index c3a9d4c..4fbd2ad 100644
--- a/tools/pm/Gir/Handlers/Ignore.pm
+++ b/tools/pm/Gir/Handlers/Package.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -15,35 +17,25 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 ##
 
-package Gir::Handlers::Ignore;
+package Gir::Handlers::Package;
 
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Common::Base);
+use parent qw(Gir::Handlers::Common::Base);
 
-use Gir::Handlers::IgnoreStores;
 
-sub _setup_handlers ($)
-{
-  my $self = shift;
 
-  $self->_set_handlers
-  (
-    Gir::Handlers::IgnoreStartStore->new (),
-    Gir::Handlers::IgnoreEndStore->new ()
-  );
-}
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-sub _setup_subhandlers ($)
-{
-  my $self = shift;
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
-}
+
+##
+## private:
+##
+
 
 ##
 ## public:
@@ -51,8 +43,20 @@ sub _setup_subhandlers ($)
 sub new ($)
 {
   my $type = shift;
-  my $class = (ref ($type) or $type or 'Gir::Handlers::Ignore');
-  my $self = $class->SUPER::new ();
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Package');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $subhandlers =
+  {
+
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
 
   return bless ($self, $class);
 }
diff --git a/tools/pm/Gir/Handlers/Parameter.pm b/tools/pm/Gir/Handlers/Parameter.pm
new file mode 100644
index 0000000..fc5ae36
--- /dev/null
+++ b/tools/pm/Gir/Handlers/Parameter.pm
@@ -0,0 +1,227 @@
+## This file was generated by taghandlerwriter.pl script.
+##
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::Parameter;
+
+use strict;
+use warnings;
+
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Array;
+use Gir::Api::Attribute;
+use Gir::Api::Doc;
+use Gir::Api::Type;
+use Gir::Api::Varargs;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Array;
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Type;
+use Gir::Handlers::Varargs;
+
+##
+## private:
+##
+sub _array_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_array_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Array->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('array');
+}
+
+sub _attribute_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
+}
+
+sub _doc_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
+}
+
+sub _type_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_type_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Type->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('type');
+}
+
+sub _varargs_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_varargs_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Varargs->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('varargs');
+}
+
+sub _array_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('array');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_array_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_array ($name, $object);
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _type_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('type');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_type_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_type ($name, $object);
+}
+
+sub _varargs_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('varargs');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_varargs_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_varargs ($name, $object);
+}
+
+##
+## public:
+##
+sub new ($)
+{
+  my $type = shift;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Parameter');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'array' => \&_array_start,
+    'attribute' => \&_attribute_start,
+    'doc' => \&_doc_start,
+    'type' => \&_type_start,
+    'varargs' => \&_varargs_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'array' => \&_array_end,
+    'attribute' => \&_attribute_end,
+    'doc' => \&_doc_end,
+    'type' => \&_type_end,
+    'varargs' => \&_varargs_end
+  });
+  my $subhandlers =
+  {
+    'array' => 'Gir::Handlers::Array',
+    'attribute' => 'Gir::Handlers::Attribute',
+    'doc' => 'Gir::Handlers::Doc',
+    'type' => 'Gir::Handlers::Type',
+    'varargs' => 'Gir::Handlers::Varargs'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
+}
+
+1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Parameters.pm b/tools/pm/Gir/Handlers/Parameters.pm
new file mode 100644
index 0000000..9592f5d
--- /dev/null
+++ b/tools/pm/Gir/Handlers/Parameters.pm
@@ -0,0 +1,91 @@
+## This file was generated by taghandlerwriter.pl script.
+##
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::Parameters;
+
+use strict;
+use warnings;
+
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Parameter;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Parameter;
+
+##
+## private:
+##
+sub _parameter_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_parameter_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Parameter->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('parameter');
+}
+
+sub _parameter_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('parameter');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_parameter_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_parameter ($name, $object);
+}
+
+##
+## public:
+##
+sub new ($)
+{
+  my $type = shift;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Parameters');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'parameter' => \&_parameter_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'parameter' => \&_parameter_end
+  });
+  my $subhandlers =
+  {
+    'parameter' => 'Gir::Handlers::Parameter'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
+}
+
+1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Ignore.pm b/tools/pm/Gir/Handlers/Prerequisite.pm
similarity index 62%
copy from tools/pm/Gir/Handlers/Ignore.pm
copy to tools/pm/Gir/Handlers/Prerequisite.pm
index c3a9d4c..103d5a7 100644
--- a/tools/pm/Gir/Handlers/Ignore.pm
+++ b/tools/pm/Gir/Handlers/Prerequisite.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -15,35 +17,25 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 ##
 
-package Gir::Handlers::Ignore;
+package Gir::Handlers::Prerequisite;
 
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Common::Base);
+use parent qw(Gir::Handlers::Common::Base);
 
-use Gir::Handlers::IgnoreStores;
 
-sub _setup_handlers ($)
-{
-  my $self = shift;
 
-  $self->_set_handlers
-  (
-    Gir::Handlers::IgnoreStartStore->new (),
-    Gir::Handlers::IgnoreEndStore->new ()
-  );
-}
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-sub _setup_subhandlers ($)
-{
-  my $self = shift;
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
-}
+
+##
+## private:
+##
+
 
 ##
 ## public:
@@ -51,8 +43,20 @@ sub _setup_subhandlers ($)
 sub new ($)
 {
   my $type = shift;
-  my $class = (ref ($type) or $type or 'Gir::Handlers::Ignore');
-  my $self = $class->SUPER::new ();
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Prerequisite');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $subhandlers =
+  {
+
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
 
   return bless ($self, $class);
 }
diff --git a/tools/pm/Gir/Handlers/Property.pm b/tools/pm/Gir/Handlers/Property.pm
new file mode 100644
index 0000000..6204547
--- /dev/null
+++ b/tools/pm/Gir/Handlers/Property.pm
@@ -0,0 +1,227 @@
+## This file was generated by taghandlerwriter.pl script.
+##
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::Property;
+
+use strict;
+use warnings;
+
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Array;
+use Gir::Api::Attribute;
+use Gir::Api::Doc;
+use Gir::Api::Type;
+use Gir::Api::Varargs;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Array;
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Type;
+use Gir::Handlers::Varargs;
+
+##
+## private:
+##
+sub _array_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_array_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Array->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('array');
+}
+
+sub _attribute_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
+}
+
+sub _doc_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
+}
+
+sub _type_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_type_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Type->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('type');
+}
+
+sub _varargs_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_varargs_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Varargs->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('varargs');
+}
+
+sub _array_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('array');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_array_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_array ($name, $object);
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _type_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('type');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_type_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_type ($name, $object);
+}
+
+sub _varargs_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('varargs');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_varargs_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_varargs ($name, $object);
+}
+
+##
+## public:
+##
+sub new ($)
+{
+  my $type = shift;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Property');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'array' => \&_array_start,
+    'attribute' => \&_attribute_start,
+    'doc' => \&_doc_start,
+    'type' => \&_type_start,
+    'varargs' => \&_varargs_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'array' => \&_array_end,
+    'attribute' => \&_attribute_end,
+    'doc' => \&_doc_end,
+    'type' => \&_type_end,
+    'varargs' => \&_varargs_end
+  });
+  my $subhandlers =
+  {
+    'array' => 'Gir::Handlers::Array',
+    'attribute' => 'Gir::Handlers::Attribute',
+    'doc' => 'Gir::Handlers::Doc',
+    'type' => 'Gir::Handlers::Type',
+    'varargs' => 'Gir::Handlers::Varargs'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
+}
+
+1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Record.pm b/tools/pm/Gir/Handlers/Record.pm
index ede22fb..9614937 100644
--- a/tools/pm/Gir/Handlers/Record.pm
+++ b/tools/pm/Gir/Handlers/Record.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -20,52 +22,263 @@ package Gir::Handlers::Record;
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Record);
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Constructor;
+use Gir::Api::Doc;
+use Gir::Api::Field;
+use Gir::Api::Function;
+use Gir::Api::Method;
+use Gir::Api::Record;
+use Gir::Api::Union;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-use Gir::Handlers::Ignore;
-use Gir::Parser;
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Constructor;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Field;
+use Gir::Handlers::Function;
+use Gir::Handlers::Method;
+use Gir::Handlers::Record;
+use Gir::Handlers::Union;
 
 ##
 ## private:
 ##
-sub _constructor_start_impl ($$$)
+sub _attribute_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
 }
 
-sub _doc_start_impl ($$$)
+sub _constructor_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_constructor_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Constructor->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('constructor');
 }
 
-sub _field_start_impl ($$$)
+sub _doc_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
 }
 
-sub _function_start_impl ($$$)
+sub _field_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_field_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Field->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('field');
 }
 
-sub _method_start_impl ($$$)
+sub _function_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_function_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Function->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('function');
 }
 
-sub _union_start_impl ($$$)
+sub _method_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_method_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Method->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('method');
 }
 
-sub _setup_subhandlers ($)
+sub _record_start ($$@)
 {
-  my $self = shift;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_record_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Record->new_with_params ($params);
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
+  $state->push_object ($object);
+  $self->_call_start_hooks ('record');
+}
+
+sub _union_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_union_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Union->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('union');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _constructor_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('constructor');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_constructor_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_constructor ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _field_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('field');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_field_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_field ($name, $object);
+}
+
+sub _function_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('function');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_function_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_function ($name, $object);
+}
+
+sub _method_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('method');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_method_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_method ($name, $object);
+}
+
+sub _record_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('record');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_record_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_record ($name, $object);
+}
+
+sub _union_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('union');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_union_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_union ($name, $object);
 }
 
 ##
@@ -75,12 +288,41 @@ sub new ($)
 {
   my $type = shift;
   my $class = (ref ($type) or $type or 'Gir::Handlers::Record');
-  my $self = $class->SUPER::new ();
-
-  $self->_set_end_ignores
+  my $start_store = Gir::Handlers::Common::Store->new
   ({
-    '*' => undef
+    'attribute' => \&_attribute_start,
+    'constructor' => \&_constructor_start,
+    'doc' => \&_doc_start,
+    'field' => \&_field_start,
+    'function' => \&_function_start,
+    'method' => \&_method_start,
+    'record' => \&_record_start,
+    'union' => \&_union_start
   });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_end,
+    'constructor' => \&_constructor_end,
+    'doc' => \&_doc_end,
+    'field' => \&_field_end,
+    'function' => \&_function_end,
+    'method' => \&_method_end,
+    'record' => \&_record_end,
+    'union' => \&_union_end
+  });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'constructor' => 'Gir::Handlers::Constructor',
+    'doc' => 'Gir::Handlers::Doc',
+    'field' => 'Gir::Handlers::Field',
+    'function' => 'Gir::Handlers::Function',
+    'method' => 'Gir::Handlers::Method',
+    'record' => 'Gir::Handlers::Record',
+    'union' => 'Gir::Handlers::Union'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
   return bless ($self, $class);
 }
 
diff --git a/tools/pm/Gir/Handlers/Repository.pm b/tools/pm/Gir/Handlers/Repository.pm
index 80436a5..9e269c1 100644
--- a/tools/pm/Gir/Handlers/Repository.pm
+++ b/tools/pm/Gir/Handlers/Repository.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -20,49 +22,139 @@ package Gir::Handlers::Repository;
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Repository);
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::CInclude;
+use Gir::Api::Include;
+use Gir::Api::Namespace;
+use Gir::Api::Package;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-use Gir::Handlers::Ignore;
+use Gir::Handlers::CInclude;
+use Gir::Handlers::Include;
 use Gir::Handlers::Namespace;
-use Gir::Parser;
+use Gir::Handlers::Package;
 
 ##
 ## private:
 ##
-sub _include_start_impl ($$$)
+sub _c_include_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_c_include_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::CInclude->new_with_params ($params);
 
-  $parser->parse_file ($params->{'name'} . '-' . $params->{'version'} . '.gir');
+  $state->push_object ($object);
+  $self->_call_start_hooks ('c:include');
 }
 
-sub _namespace_start_impl ($$$)
+sub _include_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
-  my $api = $parser->get_api ();
-  my $name = $params->{'name'};
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_include_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Include->new_with_params ($params);
 
-  #if ($api->has_namespace ($name))
-  #{
-    # TODO: error? every gir probably should have different namespace, right?
-  #}
-  #$api->add_namespace ($name);
+  $state->push_object ($object);
+  $self->_call_start_hooks ('include');
+}
 
-  my $state = $parser->get_current_state ();
+sub _namespace_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_namespace_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Namespace->new_with_params ($params);
 
-  print STDOUT 'Parsing ' . $state->get_parsed_file () . "\n";
-  $state->set_current_namespace ($name);
+  $state->push_object ($object);
+  $self->_call_start_hooks ('namespace');
 }
 
-sub _setup_subhandlers ($)
+sub _package_start ($$@)
 {
-  my $self = shift;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_package_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Package->new_with_params ($params);
 
-  $self->_set_subhandlers
-  ({
-    'namespace' => 'Gir::Handlers::Namespace',
-    '*' => 'Gir::Handlers::Ignore'
-  });
+  $state->push_object ($object);
+  $self->_call_start_hooks ('package');
+}
+
+sub _c_include_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('c:include');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_c_include_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_c_include ($name, $object);
+}
+
+sub _include_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('include');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_include_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_include ($name, $object);
+}
+
+sub _namespace_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('namespace');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_namespace_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_namespace ($name, $object);
+}
+
+sub _package_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('package');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_package_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_package ($name, $object);
 }
 
 ##
@@ -72,17 +164,29 @@ sub new ($)
 {
   my $type = shift;
   my $class = (ref ($type) or $type or 'Gir::Handlers::Repository');
-  my $self = $class->SUPER::new ();
-
-  $self->_set_start_ignores
+  my $start_store = Gir::Handlers::Common::Store->new
   ({
-    'c:include' => undef,
-    'package' => undef
+    'c:include' => \&_c_include_start,
+    'include' => \&_include_start,
+    'namespace' => \&_namespace_start,
+    'package' => \&_package_start
   });
-  $self->_set_end_ignores
+  my $end_store = Gir::Handlers::Common::Store->new
   ({
-    '*' => undef
+    'c:include' => \&_c_include_end,
+    'include' => \&_include_end,
+    'namespace' => \&_namespace_end,
+    'package' => \&_package_end
   });
+  my $subhandlers =
+  {
+    'c:include' => 'Gir::Handlers::CInclude',
+    'include' => 'Gir::Handlers::Include',
+    'namespace' => 'Gir::Handlers::Namespace',
+    'package' => 'Gir::Handlers::Package'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
   return bless ($self, $class);
 }
 
diff --git a/tools/pm/Gir/Handlers/ReturnValue.pm b/tools/pm/Gir/Handlers/ReturnValue.pm
new file mode 100644
index 0000000..9011fad
--- /dev/null
+++ b/tools/pm/Gir/Handlers/ReturnValue.pm
@@ -0,0 +1,227 @@
+## This file was generated by taghandlerwriter.pl script.
+##
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::ReturnValue;
+
+use strict;
+use warnings;
+
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Array;
+use Gir::Api::Attribute;
+use Gir::Api::Doc;
+use Gir::Api::Type;
+use Gir::Api::Varargs;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Array;
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Type;
+use Gir::Handlers::Varargs;
+
+##
+## private:
+##
+sub _array_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_array_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Array->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('array');
+}
+
+sub _attribute_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
+}
+
+sub _doc_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
+}
+
+sub _type_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_type_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Type->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('type');
+}
+
+sub _varargs_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_varargs_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Varargs->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('varargs');
+}
+
+sub _array_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('array');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_array_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_array ($name, $object);
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _type_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('type');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_type_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_type ($name, $object);
+}
+
+sub _varargs_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('varargs');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_varargs_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_varargs ($name, $object);
+}
+
+##
+## public:
+##
+sub new ($)
+{
+  my $type = shift;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::ReturnValue');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'array' => \&_array_start,
+    'attribute' => \&_attribute_start,
+    'doc' => \&_doc_start,
+    'type' => \&_type_start,
+    'varargs' => \&_varargs_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'array' => \&_array_end,
+    'attribute' => \&_attribute_end,
+    'doc' => \&_doc_end,
+    'type' => \&_type_end,
+    'varargs' => \&_varargs_end
+  });
+  my $subhandlers =
+  {
+    'array' => 'Gir::Handlers::Array',
+    'attribute' => 'Gir::Handlers::Attribute',
+    'doc' => 'Gir::Handlers::Doc',
+    'type' => 'Gir::Handlers::Type',
+    'varargs' => 'Gir::Handlers::Varargs'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
+}
+
+1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/TopLevel.pm b/tools/pm/Gir/Handlers/TopLevel.pm
index fa4dacb..2b6b7e3 100644
--- a/tools/pm/Gir/Handlers/TopLevel.pm
+++ b/tools/pm/Gir/Handlers/TopLevel.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -20,19 +22,46 @@ package Gir::Handlers::TopLevel;
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::TopLevel);
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Repository;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
 use Gir::Handlers::Repository;
 
 ##
 ## private:
 ##
-sub _gen_subhandlers ($$)
+sub _repository_start ($$@)
 {
-  my (undef, $tags) = @_;
-  my %subhandlers = map { $_ => 'Gir::Handlers::' . Gir::Handlers::Generated::Common::Misc::module_from_tag ($_) } @{$tags};
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_repository_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Repository->new_with_params ($params);
 
-  return \%subhandlers;
+  $state->push_object ($object);
+  $self->_call_start_hooks ('repository');
+}
+
+sub _repository_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('repository');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_repository_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_repository ($name, $object);
 }
 
 ##
@@ -42,21 +71,21 @@ sub new ($)
 {
   my $type = shift;
   my $class = (ref ($type) or $type or 'Gir::Handlers::TopLevel');
-  my $self = $class->SUPER::new ();
-
-  $self = bless ($self, $class);
-  $self->_set_generator (\&_gen_subhandlers);
-  $self->_setup_handlers ();
-  $self->_setup_subhandlers ();
-  $self->_set_start_ignores
+  my $start_store = Gir::Handlers::Common::Store->new
   ({
-    'repository' => undef
+    'repository' => \&_repository_start
   });
-  $self->_set_end_ignores
+  my $end_store = Gir::Handlers::Common::Store->new
   ({
-    'repository' => undef
+    'repository' => \&_repository_end
   });
-  return $self;
+  my $subhandlers =
+  {
+    'repository' => 'Gir::Handlers::Repository'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
 }
 
 1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Type.pm b/tools/pm/Gir/Handlers/Type.pm
new file mode 100644
index 0000000..626b597
--- /dev/null
+++ b/tools/pm/Gir/Handlers/Type.pm
@@ -0,0 +1,159 @@
+## This file was generated by taghandlerwriter.pl script.
+##
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::Type;
+
+use strict;
+use warnings;
+
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Array;
+use Gir::Api::Type;
+use Gir::Api::Varargs;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Array;
+use Gir::Handlers::Type;
+use Gir::Handlers::Varargs;
+
+##
+## private:
+##
+sub _array_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_array_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Array->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('array');
+}
+
+sub _type_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_type_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Type->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('type');
+}
+
+sub _varargs_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_varargs_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Varargs->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('varargs');
+}
+
+sub _array_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('array');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_array_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_array ($name, $object);
+}
+
+sub _type_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('type');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_type_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_type ($name, $object);
+}
+
+sub _varargs_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('varargs');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_varargs_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_varargs ($name, $object);
+}
+
+##
+## public:
+##
+sub new ($)
+{
+  my $type = shift;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Type');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'array' => \&_array_start,
+    'type' => \&_type_start,
+    'varargs' => \&_varargs_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'array' => \&_array_end,
+    'type' => \&_type_end,
+    'varargs' => \&_varargs_end
+  });
+  my $subhandlers =
+  {
+    'array' => 'Gir::Handlers::Array',
+    'type' => 'Gir::Handlers::Type',
+    'varargs' => 'Gir::Handlers::Varargs'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
+}
+
+1; # indicate proper module load.
diff --git a/tools/pm/Gir/Handlers/Union.pm b/tools/pm/Gir/Handlers/Union.pm
index 7ec1199..be2c861 100644
--- a/tools/pm/Gir/Handlers/Union.pm
+++ b/tools/pm/Gir/Handlers/Union.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -20,52 +22,263 @@ package Gir::Handlers::Union;
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Union);
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Constructor;
+use Gir::Api::Doc;
+use Gir::Api::Field;
+use Gir::Api::Function;
+use Gir::Api::Method;
+use Gir::Api::Record;
+use Gir::Api::Union;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-use Gir::Handlers::Ignore;
-use Gir::Parser;
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Constructor;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Field;
+use Gir::Handlers::Function;
+use Gir::Handlers::Method;
+use Gir::Handlers::Record;
+use Gir::Handlers::Union;
 
 ##
 ## private:
 ##
-sub _constructor_start_impl ($$$)
+sub _attribute_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
 }
 
-sub _doc_start_impl ($$$)
+sub _constructor_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_constructor_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Constructor->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('constructor');
 }
 
-sub _field_start_impl ($$$)
+sub _doc_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
 }
 
-sub _function_start_impl ($$$)
+sub _field_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_field_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Field->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('field');
 }
 
-sub _method_start_impl ($$$)
+sub _function_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_function_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Function->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('function');
 }
 
-sub _record_start_impl ($$$)
+sub _method_start ($$@)
 {
-  my ($self, $parser, $params) = @_;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_method_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Method->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('method');
 }
 
-sub _setup_subhandlers ($)
+sub _record_start ($$@)
 {
-  my $self = shift;
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_record_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Record->new_with_params ($params);
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
+  $state->push_object ($object);
+  $self->_call_start_hooks ('record');
+}
+
+sub _union_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_union_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Union->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('union');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _constructor_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('constructor');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_constructor_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_constructor ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _field_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('field');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_field_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_field ($name, $object);
+}
+
+sub _function_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('function');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_function_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_function ($name, $object);
+}
+
+sub _method_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('method');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_method_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_method ($name, $object);
+}
+
+sub _record_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('record');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_record_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_record ($name, $object);
+}
+
+sub _union_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('union');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_union_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_union ($name, $object);
 }
 
 ##
@@ -75,12 +288,41 @@ sub new ($)
 {
   my $type = shift;
   my $class = (ref ($type) or $type or 'Gir::Handlers::Union');
-  my $self = $class->SUPER::new ();
-
-  $self->_set_end_ignores
+  my $start_store = Gir::Handlers::Common::Store->new
   ({
-    '*' => undef
+    'attribute' => \&_attribute_start,
+    'constructor' => \&_constructor_start,
+    'doc' => \&_doc_start,
+    'field' => \&_field_start,
+    'function' => \&_function_start,
+    'method' => \&_method_start,
+    'record' => \&_record_start,
+    'union' => \&_union_start
   });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_end,
+    'constructor' => \&_constructor_end,
+    'doc' => \&_doc_end,
+    'field' => \&_field_end,
+    'function' => \&_function_end,
+    'method' => \&_method_end,
+    'record' => \&_record_end,
+    'union' => \&_union_end
+  });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'constructor' => 'Gir::Handlers::Constructor',
+    'doc' => 'Gir::Handlers::Doc',
+    'field' => 'Gir::Handlers::Field',
+    'function' => 'Gir::Handlers::Function',
+    'method' => 'Gir::Handlers::Method',
+    'record' => 'Gir::Handlers::Record',
+    'union' => 'Gir::Handlers::Union'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
   return bless ($self, $class);
 }
 
diff --git a/tools/pm/Gir/Handlers/Ignore.pm b/tools/pm/Gir/Handlers/Varargs.pm
similarity index 62%
rename from tools/pm/Gir/Handlers/Ignore.pm
rename to tools/pm/Gir/Handlers/Varargs.pm
index c3a9d4c..e9c007d 100644
--- a/tools/pm/Gir/Handlers/Ignore.pm
+++ b/tools/pm/Gir/Handlers/Varargs.pm
@@ -1,3 +1,5 @@
+## This file was generated by taghandlerwriter.pl script.
+##
 ## Copyright 2011 Krzesimir Nowak
 ##
 ## This program is free software; you can redistribute it and/or modify
@@ -15,35 +17,25 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 ##
 
-package Gir::Handlers::Ignore;
+package Gir::Handlers::Varargs;
 
 use strict;
 use warnings;
 
-use parent qw(Gir::Handlers::Generated::Common::Base);
+use parent qw(Gir::Handlers::Common::Base);
 
-use Gir::Handlers::IgnoreStores;
 
-sub _setup_handlers ($)
-{
-  my $self = shift;
 
-  $self->_set_handlers
-  (
-    Gir::Handlers::IgnoreStartStore->new (),
-    Gir::Handlers::IgnoreEndStore->new ()
-  );
-}
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
 
-sub _setup_subhandlers ($)
-{
-  my $self = shift;
 
-  $self->_set_subhandlers
-  ({
-    '*' => 'Gir::Handlers::Ignore'
-  });
-}
+
+##
+## private:
+##
+
 
 ##
 ## public:
@@ -51,8 +43,20 @@ sub _setup_subhandlers ($)
 sub new ($)
 {
   my $type = shift;
-  my $class = (ref ($type) or $type or 'Gir::Handlers::Ignore');
-  my $self = $class->SUPER::new ();
+  my $class = (ref ($type) or $type or 'Gir::Handlers::Varargs');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+
+  });
+  my $subhandlers =
+  {
+
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
 
   return bless ($self, $class);
 }
diff --git a/tools/pm/Gir/Handlers/VirtualMethod.pm b/tools/pm/Gir/Handlers/VirtualMethod.pm
new file mode 100644
index 0000000..4e002ac
--- /dev/null
+++ b/tools/pm/Gir/Handlers/VirtualMethod.pm
@@ -0,0 +1,193 @@
+## This file was generated by taghandlerwriter.pl script.
+##
+## Copyright 2011 Krzesimir Nowak
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+##
+
+package Gir::Handlers::VirtualMethod;
+
+use strict;
+use warnings;
+
+use parent qw(Gir::Handlers::Common::Base);
+
+use Gir::Api::Attribute;
+use Gir::Api::Doc;
+use Gir::Api::Parameters;
+use Gir::Api::ReturnValue;
+
+use Gir::Handlers::Common::Misc;
+use Gir::Handlers::Common::Store;
+use Gir::Handlers::Common::Tags;
+
+use Gir::Handlers::Attribute;
+use Gir::Handlers::Doc;
+use Gir::Handlers::Parameters;
+use Gir::Handlers::ReturnValue;
+
+##
+## private:
+##
+sub _attribute_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_attribute_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Attribute->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('attribute');
+}
+
+sub _doc_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_doc_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Doc->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('doc');
+}
+
+sub _parameters_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_parameters_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::Parameters->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('parameters');
+}
+
+sub _return_value_start ($$@)
+{
+  my ($self, $parser, @atts_vals) = @_;
+  my $params = Gir::Handlers::Common::Tags::get_return_value_params (@atts_vals);
+  my $state = $parser->get_current_state;
+  my $object = Gir::Api::ReturnValue->new_with_params ($params);
+
+  $state->push_object ($object);
+  $self->_call_start_hooks ('return-value');
+}
+
+sub _attribute_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('attribute');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_attribute_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_attribute ($name, $object);
+}
+
+sub _doc_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('doc');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_doc_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_doc ($name, $object);
+}
+
+sub _parameters_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('parameters');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_parameters_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_parameters ($name, $object);
+}
+
+sub _return_value_end ($$)
+{
+  my ($self, $parser) = @_;
+
+  $self->_call_end_hooks ('return-value');
+
+  my $state = $parser->get_current_state;
+  my $object = $state->get_current_object;
+
+  $state->pop_object;
+
+  my $parent_object = $state->get_current_object;
+  my $count = $parent_object->get_g_return_value_count;
+  my $name = Gir::Handlers::Common::Misc::get_object_name ($object, $count);
+
+  $parent_object->add_g_return_value ($name, $object);
+}
+
+##
+## public:
+##
+sub new ($)
+{
+  my $type = shift;
+  my $class = (ref ($type) or $type or 'Gir::Handlers::VirtualMethod');
+  my $start_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_start,
+    'doc' => \&_doc_start,
+    'parameters' => \&_parameters_start,
+    'return-value' => \&_return_value_start
+  });
+  my $end_store = Gir::Handlers::Common::Store->new
+  ({
+    'attribute' => \&_attribute_end,
+    'doc' => \&_doc_end,
+    'parameters' => \&_parameters_end,
+    'return-value' => \&_return_value_end
+  });
+  my $subhandlers =
+  {
+    'attribute' => 'Gir::Handlers::Attribute',
+    'doc' => 'Gir::Handlers::Doc',
+    'parameters' => 'Gir::Handlers::Parameters',
+    'return-value' => 'Gir::Handlers::ReturnValue'
+  };
+  my $self = $class->SUPER::new ($start_store, $end_store, $subhandlers);
+
+  return bless ($self, $class);
+}
+
+1; # indicate proper module load.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]