The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Class::IntrospectionMethods::Catalog - manage catalogs from IntrospectionMethods

SYNOPSIS

 No synopsis. Directly used by Class::IntrospectionMethods

DESCRIPTION

This class handles slot catalogs for Class::IntrospectionMethods.

Exported functions

set_method_info( target_class, method_name, info_ref )

Store construction info for method method_name of class target_class.

set_global_catalog (target_class, ...)

Store catalog informations. The first parameter is the class featuring the methods declared in the global catalog.

Following paramaters is a set of named paramaters (e.g. key => value):

name

Mandatory name for the global catalog

list

array ref containing the list of slot and catalog. E.g.:

 list => [
           [qw/foo bar baz/] => foo_catalog,
           [qw/a b z/]       => alpha_catalog,
           my_object         => my_catalog
         ],
isa

Optional hash ref declaring a containment for catalog. E.g:

  list => [ 'foo' => 'USER' ,
            'admin' => 'ROOT' ],
  isa  => { USER => 'ROOT' }

Then the 'ROOT' catalog will return 'foo', and the 'USER' catalog will return 'foo' and 'admin'.

help

Optional hash ref (slot_name => help). Store some help information for each slot.

set_global_catalog will construct:

  • A ClassCatalog object containing the global catalog informations.

  • A sub_ref containing the ClassCatalog object in a closure.

Returns ( slot_name, sub_ref ). The sub_ref is to be installed in the target class.

When called as a class method, the subref will return the ClassCatalog object. When called as a target class method, the subref will return an ObjectCatalog object associated to the ClassCatalog object stored in the closure.

These 2 object have the same API. ObjectCatalog is used to contain catalog changes that may occur at run-time. ClassCatalog informations will not change.

ClassCatalog or ObjectCatalog methods

catalog( slot_name )

Returns the catalogs names containing this slot (does not take into accounts the isa stuff)

Return either an array or an array ref depending on context.

slot ( catalog_name, ... )

Returns the slots contained in the catalogs passed as arguments. (takes into accounts the isa parameter)

all_slot()

Return a list of all slots (respecting the order defined in global_catalog).

all_catalog()

Returns a sorted list of all defined catalogs.

ObjectClass methods

Unknown methods will be forwarded to associated ClassCatalog object.

change( slot_name, catalog_name )

Move the slot into catalog catalog_name.

reset( slot_name )

Put back slot in catalog as defined by global_catalog (and as stored in ClassCatalog).

ClassCatalog methods

help ( slot_name )

Return the help info for slot_name that was given to set_global_catalog. Return an empty string if no help was provided. This help method is just a place holder, no fancy treatment is done.

info ( slot_name )

Returns construction informations of slot_name. This is handy for introspection of actual properties of slot slot_name.

The details are returned in an array that contains:

  • The slot type: i.e. either slot_type => scalar, slot_type => array or slot_type => hash.

  • If the index is tied (for array or hash slot type), the array will contain: tie_index => $tie_class. If some constructor arguments are used, the array will also contain tie_index_args => \@args.

  • If the target value (i.e. the scalar) is tied (for all slot types), the array will contain: tie_scalar => $tie_class. If some constructor arguments are used, the array will also contain tie_scalar_args => \@args.

  • If the target value (i.e. the scalar) is a plain object (for all slot types), the array will contain: class => $class. If some constructor arguments are used, the array will also contain class_args => \@args.

EXAMPLE

 package X ;
 use ExtUtils::testlib;
 
 use Class::IntrospectionMethods qw/make_methods set_obsolete_behavior/;
 
 make_methods
   (
    # slot order is important in global_catalog (and will be respected)
    global_catalog => 
    {
     name => 'metacat',
     list => [
             [qw/foo bar baz/]                 => foo_cat,
             [qw/a b z/]                       => alpha_cat,
             [qw/stdhash my_object my_scalar/] => my_cat
            ],
     isa => { my_cat => 'alpha_cat'} # my_cat includes alpha_cat
    },
    get_set => [qw/bar foo baz/],
 
    hash => 
    [
     a => {
           tie_hash      => ['MyHash', dummy => 'booh'],
           class_storage => ['MyObj', 'a' => 'foo']
          },
     [qw/z b/] => {
                   tie_hash => ['MyHash'],
                   class_storage => ['MyObj', 'b' => 'bar']
                  },
     stdhash => {
                 class_storage => ['MyObj', 'a' => 'foo']
                }
    ],
 
    object => [ 'my_object' => 'MyObj'  ],
    tie_scalar => [ 'my_scalar' => ['MyScalar' , foo => 'bar' ]] ,
    new => 'new' 
   );
 
 package main;
 
 # class catalog
 my $class_cat_obj = &X::metacat ;
 
 print $class_cat_obj->all_catalog];
 # -> alpha_cat foo_cat my_cat
 print $class_cat_obj->slot('foo_cat') ;
 # -> foo bar baz
 print $class_cat_obj->slot('alpha_cat');
 # -> a b z
 print $class_cat_obj->slot('my_cat');
 # -> a b z stdhash my_object my_scalar
 print $class_cat_obj->catalog('a');
 # -> alpha_cat
 print $class_cat_obj->info('my_object');
 # -> slot_type scalar class MyObj
 
 # more complex info result
 my @result = $class_cat_obj->info('a') ;
 
 # @result is :
 #        [
 #         'slot_type', 'hash',
 #         'class', 'MyObj',
 #         'class_args', ['a', 'foo'],
 #         'tie_index', 'MyHash',
 #         'tie_index_args', ['dummy', 'booh']
 #        ], 
 
 
 @result = $class_cat_obj->info('my_scalar') ;
 
 # @result is :
 #        [
 #         'slot_type', 'scalar',
 #         'tie_scalar', 'MyScalar',
 #         'tie_scalar_args', ['foo', 'bar']
 #        ], "test class_cat_obj->info('my_scalar')") ;
 
 # object catalog
 
 my $o = new X;
 my $cat_obj = $o->metacat ;
 
 print $cat_obj->all_catalog;
 # -> alpha_cat foo_cat my_cat
 print $cat_obj->slot('foo_cat');
 # -> foo bar baz
 
 # moving a slot
 print $class_cat_obj->catalog('stdhash') ;
 # -> my_cat
 
 $cat_obj->change('stdhash' => 'foo_cat') ;
 
 # class catalog has not changed
 print $class_cat_obj->catalog('stdhash') ;
 # -> my_cat
 
 # my_cat does no longer feature stdhash
 print $cat_obj->slot('my_cat');
 # -> a b z my_object my_scalar
 
 # stdhash is now in foo_cat
 print $cat_obj->slot('foo_cat') ;
 # -> foo bar baz stdhash
 
 print $cat_obj->catalog('stdhash');
 # -> foo_cat

COPYRIGHT

Copyright (c) 2004 Dominique Dumont. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

  L<Class::IntrospectionMethods>