9148cc2bcf6660f46edbfaa4eb6b255c9877ead2
[gitmo/Moose.git] / lib / Class / MOP / Method / Generated.pm
1
2 package Class::MOP::Method::Generated;
3
4 use strict;
5 use warnings;
6
7 use Carp 'confess';
8 use Eval::Closure;
9
10 our $AUTHORITY = 'cpan:STEVAN';
11
12 use base 'Class::MOP::Method';
13
14 ## accessors
15
16 sub new {
17     confess __PACKAGE__ . " is an abstract base class, you must provide a constructor.";
18 }
19
20 sub _initialize_body {
21     confess "No body to initialize, " . __PACKAGE__ . " is an abstract base class";
22 }
23
24 sub _generate_description {
25     my ( $self, $context ) = @_;
26     $context ||= $self->definition_context;
27
28     return "generated method (unknown origin)"
29         unless defined $context;
30
31     if (defined $context->{description}) {
32         return "$context->{description} "
33              . "(defined at $context->{file} line $context->{line})";
34     } else {
35         return "$context->{file} (line $context->{line})";
36     }
37 }
38
39 sub _compile_code {
40     my ( $self, @args ) = @_;
41     unshift @args, 'source' if @args % 2;
42     my %args = @args;
43
44     my $context = delete $args{context};
45     my $environment = $self->can('_eval_environment')
46         ? $self->_eval_environment
47         : {};
48
49     return eval_closure(
50         environment => $environment,
51         description => $self->_generate_description($context),
52         %args,
53     );
54 }
55
56 1;
57
58 __END__
59
60 =pod
61
62 =head1 NAME 
63
64 Class::MOP::Method::Generated - Abstract base class for generated methods
65
66 =head1 DESCRIPTION
67
68 This is a C<Class::MOP::Method> subclass which is subclassed by
69 C<Class::MOP::Method::Accessor> and
70 C<Class::MOP::Method::Constructor>.
71
72 It is not intended to be used directly.
73
74 =cut
75