NAME
Devel::Stub - stub some methods for development purpose
DESCRIPTION
For example, when you develop a webapp,you'd like to develop views and/or controllers using stubbed model modules which can return expected data. This module helps it.
With this module,you can stub some methods on exisiting moudle
This module adds a lib path on initializing the app (when invoked with specific environment variable) so that you can organize stub file on the path outside of main lib path
Changes you have to do on main app are just one line and it doesn't affect if you kick the app in usual way. You have to do nothing on existing modules.
SYNOPSIS
The step is; 1) declare Devel::Stub::lib on main applicaton file. 2) Overide methods with module which has same pacakge of original one.
Devel::Stub::lib
Change lib path for stubbing.
use lib qw/mylib/;
use Devel::Stub::lib active_if => $ENV{STUB};
use Foo::Bar;
In this case,if $ENV{STUB} are given, this script will add 'stub' to @INC.
Devel::Stub
Stub some methods on existing module.
stub/Foo/Bar.pm
package Foo::Bar;
use Devel::Stub on => 'mylib';
# this moudle override methods on mylib/Foo/Bar.pm
stub foo => sub {
"stubbed!"
};
EXAMPLE
Suppose these files;
./app.pl
./mylib/Abcd/Efg.pm
./mylib/Foo/Bar.pm
./stub/Foo/Bar.pm
- app.pl
-
use lib 'mylib'; use Devel::Stub::lib active_if => $ENV{STUB} use Foo::Bar; my $b = Foo::Bar->new print $b->woo; print $b->moo;
- mylib/Foo/Bar.pm
-
package Foo::Bar sub new{ bless {},shift; } sub woo{ "woo!"; } sub moo { "moo!" } 1;
- stub/Foo/Bar.pm
-
package Foo::Bar; use Devel::Stub on => "mylib"; stub woo => sub { "stubbed!"; }; # override just 'woo' method. Others are intact. 1;
normal use
$ perl app.pl #=> woo!moo!
stub use
$ STUB=1 perl app.pl #=>stubbed!moo!
PARAMETERS
Devel::Stub::lib
EXAMPLE:
use Devel::Stub::lib
active_if => ($ENV{APP_ENV} eq 'development'), path => 'mystub', quiet => 1;
- active_if (optional - default: $ENV{STUB} )
-
specify condition for including stub path.
- path (optional - default: 'stub' )
-
specify path for stub modules. That will insert on top of @INC
- quite (optional - default: false )
-
if true is given,no warning message will be shown when entering stub mode.
Devel::Stub
EXAMPLE:
use Devel::Stub on => "mylib"
- on (required)
-
specify where original modules are located. That mean if you want to stub method in 'foo_lib/Foga/Woo.pm', you should put 'foo_lib'.
WRITING STUBS
you can define stubs with stub
method.
package Foo::Woo;
use Devel::Stub on => 'mylib'
stub hoo => sub {
+{ stubbed => "data"};
};
INVOKE ORIGINAL METHOD
you can invoke original method with _orginal()
.
stub foo => sub {
my ($self,$param) = @_;
if($param ne 'xxx') {
return _original(@_); # invoke original one for some situation.
}
["stubbed","data","is","here"];
};
TAG option
Opionaly,if you specify TAG
parameter with stub method. That won't be activated unless you exec app with STUB_TAG environment.
stub foo => sub {
"stubbed!";
},TAG => ["devel","local"];
stub
TAG => ["staging"],
moo => sub {
"stubbed!";
};
with stub file above,
STUB=1 STUB_TAG=local perl app.pl # 'foo' is stubbed
STUB=1 STUB_TAG=staging perl app.pl # 'moo' is stubbed.
STUB=1 perl app.pl # neither is stubbed.
AUTHOR
Masaki Sawamura <sawamur@cpan.org>
LICENCE AND COPYRIGHT
Copyright (c) 2012, Masaki Sawamura. All rights reserved.
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlartistic.