/[Frey]/trunk/lib/Frey/Introspect.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/lib/Frey/Introspect.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 50 - (hide annotations)
Wed Jul 2 22:30:19 2008 UTC (15 years, 10 months ago) by dpavlin
File size: 2828 byte(s)
more introspection, including few dummy types
1 dpavlin 49 package Frey::Introspect;
2    
3     use Moose;
4     use Carp;
5     use Class::MOP;
6     use Moose::Meta::Role;
7     use Moose::Meta::Class;
8     use Scalar::Util qw/blessed/;
9     use Data::Dump qw/dump/;
10     use File::Slurp;
11    
12     extends 'Frey';
13    
14     has 'package' => (
15     is => 'rw',
16     isa => 'Str',
17     required => 1,
18     );
19    
20     sub examine {
21     my ($self) = @_;
22    
23     my $package = $self->package;
24    
25 dpavlin 50 #intercept role application so we can accurately generate
26     #method and attribute information for the parent class.
27     #this is fragile, but there is not better way that i am aware of
28     my $rmeta = Moose::Meta::Role->meta;
29     $rmeta->make_mutable if $rmeta->is_immutable;
30     my $original_apply = $rmeta->get_method("apply")->body;
31     $rmeta->remove_method("apply");
32     my @roles_to_apply;
33     $rmeta->add_method("apply", sub{push(@roles_to_apply, [@_])});
34     #load the package with the hacked Moose::Meta::Role
35     eval { Class::MOP::load_class($package); };
36     confess "Failed to load package ${package} $@" if $@;
37 dpavlin 49
38 dpavlin 50 #get on with analyzing the package
39     my $meta = $package->meta;
40     my $spec = {};
41     my ($class, $is_role);
42     if($package->meta->isa('Moose::Meta::Role')){
43     $is_role = 1;
44     # we need to apply the role to a class to be able to properly introspect it
45     $class = Moose::Meta::Class->create_anon_class;
46     $original_apply->($meta, $class);
47     } else {
48     #roles don't have superclasses ...
49     $class = $meta;
50     my @superclasses = map{ $_->meta->name }
51     grep { $_ ne 'Moose::Object' } $meta->superclasses;
52     warn "superclasses ",dump( @superclasses );
53     }
54 dpavlin 49
55     my $out;
56    
57     my ( $m, $c ) = split(/::/, $class->name, 2);
58     my $filename = "$m.$c.js";
59    
60     $out .= "Module(\"$m\", function (m) {\n\tClass(\"$c\", {\n\t\thas: {\n";
61    
62     foreach ( $class->get_attribute_list ) {
63     $out .= "\t\t\t$_: {\n";
64    
65 dpavlin 50 my $attr = $class->get_attribute($_);
66     my $is = $attr->_is_metadata;
67     $out .= "\t\t\t\tis: \"$is\",\n" if defined $is;
68     $out .= "\t\t\t\tlazy: true,\n" if $attr->is_lazy;
69     $out .= "\t\t\t\trequired: true,\n" if $attr->is_required;
70     $out .= "\t\t\t\tinit: \"" . $attr->init_arg . "\",\n" if $attr->init_arg; # FIXME
71    
72     if( defined(my $isa = $attr->_isa_metadata) ){
73     if( blessed $isa ){
74     while( blessed $isa ){
75     $isa = $isa->name;
76     }
77     }
78     $isa =~ s/\s+\|\s+undef//gi;
79     $out .= "\t\t\t\tisa: Moose.$isa,\n";
80     }
81    
82    
83 dpavlin 49 $out .= "\t\t\t},\n";
84    
85     }
86    
87     $out .= "\t\t},\n";
88    
89     $out .= "\t}),\n";
90 dpavlin 50
91     $out =~ s/,\n$/\n/;
92 dpavlin 49 $out .= "});\n";
93    
94     $out .= "\nconsole.log( 'loaded " . $class->name . " from $filename' );\n";
95    
96     warn $class->dump(2);
97    
98     warn "get_attribute_list = ",dump( $class->get_attribute_list );
99     # warn dump( map{ $class->get_attribute($_) } sort $class->get_attribute_list );
100    
101     warn dump( $class->get_method_list );
102    
103     print $out;
104     my $path = "static/blib/$filename";
105     write_file( $path, $out );
106     warn "# created $path\n";
107     }
108    
109     =head1 SEE ALSO
110    
111     L<MooseX::AutoDoc> on which this code is based
112    
113     =cut
114    
115     1;

  ViewVC Help
Powered by ViewVC 1.1.26