1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
package Class::MOP::Method;
use strict;
use warnings;
use Carp 'confess';
use Scalar::Util 'reftype', 'blessed';
use B 'svref_2object';
our $VERSION = '0.05';
our $AUTHORITY = 'cpan:STEVAN';
use base 'Class::MOP::Object';
# NOTE:
# if poked in the right way,
# they should act like CODE refs.
use overload '&{}' => sub { $_[0]->{body} }, fallback => 1;
# introspection
sub meta {
require Class::MOP::Class;
Class::MOP::Class->initialize(blessed($_[0]) || $_[0]);
}
# construction
sub wrap {
my $class = shift;
my $code = shift;
('CODE' eq (reftype($code) || ''))
|| confess "You must supply a CODE reference to bless, not (" . ($code || 'undef') . ")";
bless {
body => $code
} => blessed($class) || $class;
}
## accessors
sub body { (shift)->{body} }
# TODO - add associated_class
# informational
# NOTE:
# this may not be the same name
# as the class you got it from
# This gets the package stash name
# associated with the actual CODE-ref
sub package_name {
my $code = (shift)->{body};
svref_2object($code)->GV->STASH->NAME;
}
# NOTE:
# this may not be the same name
# as the method name it is stored
# with. This gets the name associated
# with the actual CODE-ref
sub name {
my $code = (shift)->{body};
svref_2object($code)->GV->NAME;
}
sub fully_qualified_name {
my $code = shift;
$code->package_name . '::' . $code->name;
}
1;
__END__
=pod
=head1 NAME
Class::MOP::Method - Method Meta Object
=head1 SYNOPSIS
# ... more to come later maybe
=head1 DESCRIPTION
The Method Protocol is very small, since methods in Perl 5 are just
subroutines within the particular package. We provide a very basic
introspection interface.
=head1 METHODS
=head2 Introspection
=over 4
=item B<meta>
This will return a B<Class::MOP::Class> instance which is related
to this class.
=back
=head2 Construction
=over 4
=item B<wrap (&code)>
=back
=head2 Informational
=over 4
=item B<body>
=item B<name>
=item B<package_name>
=item B<fully_qualified_name>
=back
=head1 AUTHORS
Stevan Little E<lt>stevan@iinteractive.comE<gt>
Yuval Kogman E<lt>nothingmuch@woobling.comE<gt>
=head1 COPYRIGHT AND LICENSE
Copyright 2006 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
|