use strict;
use warnings;
-our $VERSION = '0.01';
+use Carp 'confess';
+
+our $VERSION = '0.02';
+our $AUTHORITY = 'cpan:STEVAN';
use base 'Moose::Meta::Method';
+sub new {
+ my ( $class, %args ) = @_;
+
+ # the package can be overridden by roles
+ # it is really more like body's compilation stash
+ # this is where we need to override the definition of super() so that the
+ # body of the code can call the right overridden version
+ my $_super_package = $args{package} || $args{class}->name;
+
+ my $name = $args{name};
+
+ my $super = $args{class}->find_next_method_by_name($name);
+
+ (defined $super)
+ || confess "You cannot override '$name' because it has no super method";
+
+ my $super_body = $super->body;
+
+ my $method = $args{method};
+
+ my $body = sub {
+ local @Moose::SUPER_ARGS = @_;
+ local $Moose::SUPER_BODY = $super_body;
+ return $method->(@_);
+ };
+
+ # FIXME do we need this make sure this works for next::method?
+ # subname "${_super_package}::${name}", $method;
+
+ # FIXME store additional attrs
+ $class->wrap(
+ $body,
+ package_name => $args{class}->name,
+ name => $name
+ );
+}
+
1;
__END__
=head1 DESCRIPTION
-This is primarily used to tag methods created with the C<override> keyword. It
-is currently just a subclass of L<Moose::Meta::Method>.
+This class implements method overriding logic for the L<Moose> C<override> keyword.
+
+This involves setting up C<super> for the overriding body, and dispatching to
+the correct parent method upon its invocation.
-Later releases will likely encapsulate the C<super> behavior of overriden methods,
-rather than that being the responsibility of the class. But this is low priority
-for now.
+=head1 METHODS
+
+=over 4
+
+=item B<new>
+
+=back
=head1 BUGS
=head1 AUTHOR
-Stevan Little E<lt>stevan@iinteractive.comE<gt>
-
-Yuval Kogman E<lt>nothingmuch@woobling.comE<gt>
+Yuval Kogman E<lt>nothingmuch@cpan.orgE<gt>
=head1 COPYRIGHT AND LICENSE
-Copyright 2006 by Infinity Interactive, Inc.
+Copyright 2006-2008 by Infinity Interactive, Inc.
L<http://www.iinteractive.com>
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
-=cut
\ No newline at end of file
+=cut