DESCRIPTION
Meta programming is becoming more and more popular. The popularity of Meta programming comes from the fact that many problems are made significantly easier. There are a few specialized Meta tools out there, for instance <Class:MOP> which is used by Moose to track class metadata.Meta::Builder is designed to be a generic tool for writing Meta objects. Unlike specialized tools, Meta::Builder makes no assumptions about what metrics you will care about. Meta::Builder also mkaes it simple for others to extend your meta-object based tools by providing hooks for other packages to add metrics to your meta object.
If a specialized Meta object tool is available to meet your needs please use it. However if you need a simple Meta object to track a couple metrics, use Meta::Builder.
Meta::Builder is also low-sugar and low-dep. In most cases you will not want a class that needs a meta object to use your meta-object class directly. Rather you will usually want to create a sugar class that exports enhanced API functions that manipulate the meta object.
SYNOPSIS
My/Meta.pm:
package My::Meta;
use strict;
use warnings;
use Meta::Builder;
# Name the accessor that will be defined in the class that uses the meta object
# It is used to retrieve the classes meta object.
accessor "mymeta";
# Add a metric with two actions
metric mymetric => sub { [] },
pop => sub {
my $self = shift;
my ( $data ) = @_;
pop @$data;
},
push => sub {
my $self = shift;
my ( $data, $metric, $action, @args ) = @_;
push @$data => @args;
};
# Add an additional action to the metric
action mymetric => ( get_ref => sub { shift });
# Add some predefined metric types + actions
hash_metric 'my_hashmetric';
lists_metric 'my_listsmetric';
My.pm:
package My; use strict; use warnings; use My::Meta; My::Meta->new( __PACKAGE__ ); # My::Meta defines mymeta() as the accessor we use to get our meta object. # this is the ONLY way to get the meta object for this class. mymeta()->mymetric_push( "some data" ); mymeta()->my_hashmetric_add( key => 'value' ); mymeta()->my_listsmetric_push( list => qw/valueA valueB/ ); # It works fine as an object/class method as well. __PACKAGE__->mymeta->do_thing(...); ...;
USING
When you use Meta::Builder your class is automatically turned into a subclass of Meta::Builder::Base. In addition several ``sugar'' functions are exported into your namespace. To avoid the ``sugar'' functions you can simply sublass Meta::Builder::Base directly.EXPORTS
- metric( $name, \&generator, %actions )
- Wraper around "caller-"add_metric()>. See Meta::Builder::Base.
- action( $metric, $name, $code )
- Wraper around "caller-"add_action()>. See Meta::Builder::Base.
- hash_metric( $name, %additional_actions )
- Wraper around "caller-"add_hash_metric()>. See Meta::Builder::Base.
- lists_metric( $name, %additional_actions )
- Wraper around "caller-"add_lists_metric()>. See Meta::Builder::Base.
- before( $metric, $action, $code )
- Wraper around "caller-"hook_before()>. See Meta::Builder::Base.
- after( $metric, $action, $code )
- Wraper around "caller-"hook_after()>. See Meta::Builder::Base.
- accessor( $name )
- Wraper around "caller-"set_accessor()>. See Meta::Builder::Base.
- make_immutable()
- Overrides all functions/methods that alter the meta objects meta-data. This in effect prevents anything from adding new metrics, actions, or hooks without directly editing the metadata.
AUTHORS
Chad Granum [email protected]COPYRIGHT
Copyright (C) 2010 Chad GranumMeta-Builder is free software; Standard perl licence.
Meta-Builder 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 license for more details.