moving logic to widget class
[catagits/Reaction.git] / script / rclass_back_to_moose.pl
CommitLineData
319bf4d0 1#!/usr/bin/env perl
2
3use strict;
4use warnings;
5use IO::All;
6
7sub with_file (&) {
8 my ($code) = @_;
9 my $fname = $_;
10 my $data < io($fname);
11 {
12 local $_ = $data;
13 $code->();
14 $data = $_;
15 }
16 $data > io($fname);
17}
18
b134d5b6 19sub with_class_or_role_block (&) {
319bf4d0 20 my ($code) = @_;
c28a7901 21 $_ =~ s{^(class|role)\s*(.*?)which\s*{(.*?)^};}
319bf4d0 22 {
c28a7901 23 local *_ = { type => $1, header => $2, body => $3 };
319bf4d0 24 $code->();
25 }sme;
26}
27
28sub parse_header {
29 my $h = $_{header};
30 $h =~ s/^\s*\S+\s+// || die;
31 my @base;
c28a7901 32 while ($h =~ /is\s*([^ ,]+),?/g) {
319bf4d0 33 push(@base, $1);
34 }
35 return @base;
36}
37
38sub build_extends {
39 my $base = join(', ', parse_header);
40 ($base ? "extends ${base};\n\n" : '');
41}
42
43sub sq { # short for 'strip quotes'
44 my $copy = $_[0];
45 $copy =~ s/^'(.*)'$/$1/;
46 $copy =~ s/^"(.*)"$/$1/;
47 $copy;
48}
49
50sub filtered_body {
51 local $_ = $_{body};
52 s/^ //g;
c28a7901 53 s/^\s*implements *(\S+).*?{/"sub ${\sq $1} {"/ge;
54 s/^\s*does/with/g;
55 s/^\s*overrides/override/g;
319bf4d0 56 $_;
57}
58
59sub top { "use namespace::clean -except => [ qw(meta) ];\n" }
c28a7901 60sub tail { $_{type} eq 'class' ? "__PACKAGE__->meta->make_immutable;\n" : ""; }
319bf4d0 61
c28a7901 62for (@ARGV) {
319bf4d0 63 with_file {
b134d5b6 64 with_class_or_role_block {
319bf4d0 65 return top.build_extends.filtered_body.tail;
66 };
67 };
68}
69
701;