package Exporter::Declare::Export; use strict; use warnings; use Carp qw/croak carp/; use Scalar::Util qw/reftype/; our %OBJECT_DATA; sub required_specs {qw/ exported_by /} sub new { my $class = shift; my ( $item, %specs ) = @_; my $self = bless( $item, $class ); for my $prop ( $self->required_specs ) { croak "You must specify $prop when calling $class\->new()" unless $specs{$prop}; } $OBJECT_DATA{$self} = \%specs; return $self; } sub _data { my $self = shift; ($OBJECT_DATA{$self}) = @_ if @_; $OBJECT_DATA{$self}; } sub exported_by { shift->_data->{ exported_by }; } sub inject { my $self = shift; my ( $class, $name, @args ) = @_; carp( "Ignoring arguments importing (" . reftype($self) . ")$name into $class: " . join( ', ', @args ) ) if (@args); croak "You must provide a class and name to inject()" unless $class && $name; no strict 'refs'; no warnings 'once'; *{"$class\::$name"} = $self; } sub DESTROY { my $self = shift; delete $OBJECT_DATA{$self}; } 1; =head1 NAME Exporter::Declare::Export - Base class for all export objects. =head1 DESCRIPTION All exports are refs, and all are blessed. This class tracks some per-export information via an inside-out objects system. All things an export may need to do, such as inject itself into a package are handled here. This allows some complicated, or ugly logic to be abstracted out of the exporter and metadata classes. =head1 METHODS =over =item $class->new( $ref, exported_by => $package, %data ) Create a new export from $ref. You must specify the name of the class doing the exporting. =item $export->inject( $package, $name, @args ) This will inject the export into $package under $name. @args are ignored in most cases. See L for an example where they are used. =item $package = $export->exported_by() Returns the name of the package from which this export was originally exported. =item @params = $export->required_specs() Documented for subclassing purposes. This should always return a list of required parameters at construction time. =item $export->DESTROY() Documented for subclassing purposes. This takes care of cleanup related to storing data in an inside-out objects system. =back =head1 AUTHORS Chad Granum L =head1 COPYRIGHT Copyright (C) 2010 Chad Granum Exporter-Declare is free software; Standard perl licence. Exporter-Declare 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.