use Carp 'confess';
use Scalar::Util 'blessed';
-our $VERSION = '0.67';
+our $VERSION = '0.92';
$VERSION = eval $VERSION;
our $AUTHORITY = 'cpan:STEVAN';
);
if (@$before && @$after) {
$modifier_table->{cache} = sub {
- $_->(@_) for @{$before};
+ for my $c (@$before) { $c->(@_) };
my @rval;
((defined wantarray) ?
((wantarray) ?
($rval[0] = $around->{cache}->(@_)))
:
$around->{cache}->(@_));
- $_->(@_) for @{$after};
+ for my $c (@$after) { $c->(@_) };
return unless defined wantarray;
return wantarray ? @rval : $rval[0];
}
}
elsif (@$before && !@$after) {
$modifier_table->{cache} = sub {
- $_->(@_) for @{$before};
+ for my $c (@$before) { $c->(@_) };
return $around->{cache}->(@_);
}
}
($rval[0] = $around->{cache}->(@_)))
:
$around->{cache}->(@_));
- $_->(@_) for @{$after};
+ for my $c (@$after) { $c->(@_) };
return unless defined wantarray;
return wantarray ? @rval : $rval[0];
}
sub wrap {
my ( $class, $code, %params ) = @_;
-
+
(blessed($code) && $code->isa('Class::MOP::Method'))
|| confess "Can only wrap blessed CODE";
-
+
my $modifier_table = {
cache => undef,
orig => $code,
},
};
$_build_wrapped_method->($modifier_table);
- my $method = $class->SUPER::wrap(
+ return $class->SUPER::wrap(
sub { $modifier_table->{cache}->(@_) },
- # get these from the original
+ # get these from the original
# unless explicitly overriden
- package_name => $params{package_name} || $code->package_name,
- name => $params{name} || $code->name,
+ package_name => $params{package_name} || $code->package_name,
+ name => $params{name} || $code->name,
+
+ modifier_table => $modifier_table,
);
- $method->{'modifier_table'} = $modifier_table;
- $method;
+}
+
+sub _new {
+ my $class = shift;
+ return Class::MOP::Class->initialize($class)->new_object(@_)
+ if $class ne __PACKAGE__;
+
+ my $params = @_ == 1 ? $_[0] : {@_};
+
+ return bless {
+ # inherited from Class::MOP::Method
+ 'body' => $params->{body},
+ 'associated_metaclass' => $params->{associated_metaclass},
+ 'package_name' => $params->{package_name},
+ 'name' => $params->{name},
+ 'original_method' => $params->{original_method},
+
+ # defined in this class
+ 'modifier_table' => $params->{modifier_table}
+ } => $class;
}
sub get_original_method {
$_build_wrapped_method->($code->{'modifier_table'});
}
+sub before_modifiers {
+ my $code = shift;
+ return @{$code->{'modifier_table'}->{before}};
+}
+
sub add_after_modifier {
my $code = shift;
my $modifier = shift;
$_build_wrapped_method->($code->{'modifier_table'});
}
+sub after_modifiers {
+ my $code = shift;
+ return @{$code->{'modifier_table'}->{after}};
+}
+
{
# NOTE:
# this is another possible candidate for
}
}
+sub around_modifiers {
+ my $code = shift;
+ return @{$code->{'modifier_table'}->{around}->{methods}};
+}
+
1;
__END__
=head1 NAME
-Class::MOP::Method::Wrapped - Method Meta Object to handle before/around/after modifiers
+Class::MOP::Method::Wrapped - Method Meta Object for methods with before/after/around modifiers
=head1 DESCRIPTION
-This is a L<Class::MOP::Method> subclass which provides the funtionality
-to wrap a given CODE reference with before, after and around method modifiers.
+This is a L<Class::MOP::Method> subclass which implements before,
+after, and around method modifiers.
=head1 METHODS
=over 4
-=item B<wrap ($code)>
+=item B<< Class::MOP::Method::Wrapped->wrap($metamethod, %options) >>
-This is the constructor, it will return a B<Class::MOP::Method::Wrapped>
-instance that can be used to add before, after and around modifiers to.
+This is the constructor. It accepts a L<Class::MOP::Method> object and
+a hash of options.
-=item B<get_original_method>
+The options are:
-This returns the original CODE reference that was provided to the
-constructor.
+=over 8
+
+=item * name
+
+The method name (without a package name). This will be taken from the
+provided L<Class::MOP::Method> object if it is not provided.
+
+=item * package_name
+
+The package name for the method. This will be taken from the provided
+L<Class::MOP::Method> object if it is not provided.
+
+=item * associated_metaclass
+
+An optional L<Class::MOP::Class> object. This is the metaclass for the
+method's class.
=back
-=head2 Modifiers
+=item B<< $metamethod->get_original_method >>
+
+This returns the L<Class::MOP::Method> object that was passed to the
+constructor.
-These three methods will add the method modifiers to the wrapped
-CODE reference. For more information on how method modifiers work,
-see the section in L<Class::MOP::Class>.
+=item B<< $metamethod->add_before_modifier($code) >>
-=over 4
+=item B<< $metamethod->add_after_modifier($code) >>
+
+=item B<< $metamethod->add_around_modifier($code) >>
+
+These methods all take a subroutine reference and apply it as a
+modifier to the original method.
+
+=item B<< $metamethod->before_modifiers >>
-=item B<add_before_modifier ($code)>
+=item B<< $metamethod->after_modifiers >>
-=item B<add_after_modifier ($code)>
+=item B<< $metamethod->around_modifiers >>
-=item B<add_around_modifier ($code)>
+These methods all return a list of subroutine references which are
+acting as the specified type of modifier.
=back
=head1 COPYRIGHT AND LICENSE
-Copyright 2006-2008 by Infinity Interactive, Inc.
+Copyright 2006-2009 by Infinity Interactive, Inc.
L<http://www.iinteractive.com>