advanced modulinos trial

22
Advanced Modulinos brian d foy The Perl Review Houston Perl Mongers

Upload: brian-d-foy

Post on 18-May-2015

1.624 views

Category:

Technology


0 download

DESCRIPTION

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.

TRANSCRIPT

Page 1: Advanced modulinos trial

★AdvancedModulinos

brian d foyThe Perl Review

Houston Perl Mongers

Page 2: Advanced modulinos trial

Files that work as programs and modules

at the same time

Page 3: Advanced modulinos trial

Unit testing

Code reüse

Distribution

Page 4: Advanced modulinos trial

# hello.pluse v5.10;

say 'Hello World!';

Page 5: Advanced modulinos trial

% perl hello.plHello World!

Page 6: Advanced modulinos trial

use v5.10;

run();

sub run {say 'Hello World!';}

Page 7: Advanced modulinos trial

% perl hello.plHello World!

Page 8: Advanced modulinos trial

# Hello.pmuse v5.10;

run() unless caller;

sub run {say 'Hello World!';}

Page 9: Advanced modulinos trial

% perl hello.plHello World!% perl -MHello -e 1%

Page 10: Advanced modulinos trial

package Hello;use v5.10;

__PACKAGE__->run unless caller;

sub run {say 'Hello World!';}

Page 11: Advanced modulinos trial

use Test::More;use Test::Output;

use_ok( 'Hello' );

stdout_ok( sub { Hello->run() }, 'Hello World!', ... );

Page 12: Advanced modulinos trial

package Hello;use v5.10;

__PACKAGE__->run unless caller;

sub run { my( $self ) = @_; say { $self->fh } 'Hello World!';}

Page 13: Advanced modulinos trial

package Hello;use v5.10;...;sub fh { *STDOUT }

Page 14: Advanced modulinos trial

use Test::More;

use_ok( 'Hello' );

our $string;{open my $fh, '>', \$string;*Hello::fh = sub { $fh };}

Hello->run;is($string, 'Hello World!');

Page 15: Advanced modulinos trial

package Hello;use v5.10;...;BEGIN {my $fh = \*STDOUT;sub fh { $fh }sub set_fh { $fh = ...;}

Page 16: Advanced modulinos trial

use Test::More;

use_ok( 'Hello' );

open my $fh, '>', \my $string;Hello->set_fh( $fh );Hello->run;is($string, 'Hello World!');

Page 17: Advanced modulinos trial

% perl hello.plHello World!% perl hello.pl HoustonHello World!% perl hello.pl -m TexasHello World!% perl hello.pl < partiersHello World!

Page 18: Advanced modulinos trial

Connect the command line to new()

% hello.pl -s Houston

use Hello;

my $app->new( input => $in_fh, output => $out_fh, message => $message, );

$app->greet;

?new()

Page 19: Advanced modulinos trial

sub run { my( $class, @args ) = @_; my %args = $class->process_args(@args); my $self = $class->new(%args); say { $self->fh } $self->message; }

Page 20: Advanced modulinos trial

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; }

Page 21: Advanced modulinos trial

$app->new( input_fh => $in, output_fh => $out, message => 'Hello World!' );

Page 22: Advanced modulinos trial

sub new { my( $class, %args ) = @_; my $self = bless {}, $class; foreach ( keys %args ) { # maybe more complicated $self->set( $_, $args{$_} ); }

return $self; }