Advanced modulinos trial

2,151 views
2,031 views

Published on

This is a first try at the Advanced Modulinos talk I'll give at this summer's conferences. It's still rough and I'm working out some stuff.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,151
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
10
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Advanced modulinos trial

  1. 1. Advanced Modulinos★ brian d foy The Perl Review Houston Perl Mongers
  2. 2. Files that work asprograms and modules at the same time
  3. 3. Unit testingCode reüseDistribution
  4. 4. # hello.pluse v5.10;say Hello World!;
  5. 5. % perl hello.plHello World!
  6. 6. use v5.10;run();sub run { say Hello World!; }
  7. 7. % perl hello.plHello World!
  8. 8. # Hello.pmuse v5.10;run() unless caller;sub run { say Hello World!; }
  9. 9. % perl hello.plHello World!% perl -MHello -e 1%
  10. 10. package Hello;use v5.10;__PACKAGE__->run unless caller;sub run { say Hello World!; }
  11. 11. use Test::More;use Test::Output;use_ok( Hello );stdout_ok( sub { Hello->run() }, Hello World!, ... );
  12. 12. package Hello;use v5.10;__PACKAGE__->run unless caller;sub run { my( $self ) = @_; say { $self->fh } Hello World!; }
  13. 13. package Hello;use v5.10;...;sub fh { *STDOUT }
  14. 14. use Test::More;use_ok( Hello );our $string;{open my $fh, >, $string;*Hello::fh = sub { $fh };}Hello->run;is($string, Hello World!);
  15. 15. package Hello;use v5.10;...;BEGIN {my $fh = *STDOUT;sub fh { $fh }sub set_fh { $fh = ...;}
  16. 16. use Test::More;use_ok( Hello );open my $fh, >, my $string;Hello->set_fh( $fh );Hello->run;is($string, Hello World!);
  17. 17. % perl hello.plHello World!% perl hello.pl HoustonHello World!% perl hello.pl -m TexasHello World!% perl hello.pl < partiersHello World!
  18. 18. Connect the command line to new()% hello.pl -s Houston ? use Hello; new() my $app->new( input => $in_fh, output => $out_fh, message => $message, ); $app->greet;
  19. 19. sub run { my( $class, @args ) = @_; my %args = $class->process_args(@args); my $self = $class->new(%args); say { $self->fh } $self->message; }
  20. 20. sub process_args { require Getopt::Std; local @ARGV = @_; getopts(oim:, my %opts); $opts(o) //= *STDOUT; $opts(i) //= *STDIN; $opts(m) //= Hello World!; # left over @_? my %args = map { $opts_map{$_} => $opts{$_} } keys %opts; }
  21. 21. $app->new( input_fh => $in, output_fh => $out, message => Hello World! );
  22. 22. sub new { my( $class, %args ) = @_; my $self = bless {}, $class; foreach ( keys %args ) { # maybe more complicated $self->set( $_, $args{$_} ); } return $self; }

×