better definition context for native delegation methods
[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 use base 'Class::MOP::Method';
11
12 ## accessors
13
14 sub new {
15     confess __PACKAGE__ . " is an abstract base class, you must provide a constructor.";
16 }
17
18 sub _initialize_body {
19     confess "No body to initialize, " . __PACKAGE__ . " is an abstract base class";
20 }
21
22 sub _generate_description {
23     my ( $self, $context ) = @_;
24     $context ||= $self->definition_context;
25
26     my $desc = "generated method";
27     my $origin = "unknown origin";
28
29     if (defined $context) {
30         if (defined $context->{description}) {
31             $desc = $context->{description};
32         }
33
34         if (defined $context->{file} || defined $context->{line}) {
35             $origin = "defined at "
36                     . (defined $context->{file}
37                         ? $context->{file} : "<unknown file>")
38                     . " line "
39                     . (defined $context->{line}
40                         ? $context->{line} : "<unknown line>");
41         }
42     }
43
44     return "$desc ($origin)";
45 }
46
47 sub _compile_code {
48     my ( $self, @args ) = @_;
49     unshift @args, 'source' if @args % 2;
50     my %args = @args;
51
52     my $context = delete $args{context};
53     my $environment = $self->can('_eval_environment')
54         ? $self->_eval_environment
55         : {};
56
57     return eval_closure(
58         environment => $environment,
59         description => $self->_generate_description($context),
60         %args,
61     );
62 }
63
64 1;
65
66 __END__
67
68 =pod
69
70 =head1 NAME 
71
72 Class::MOP::Method::Generated - Abstract base class for generated methods
73
74 =head1 DESCRIPTION
75
76 This is a C<Class::MOP::Method> subclass which is subclassed by
77 C<Class::MOP::Method::Accessor> and
78 C<Class::MOP::Method::Constructor>.
79
80 It is not intended to be used directly.
81
82 =cut
83